将 CsvHelper 从 15.0.5 升级到 30.0.1 后,CSVHelper 中的 RegisterClassMap 出现单元测试问题

问题描述 投票:0回答:1

升级 CsvHelper 后,在单元测试中我得到了 '无法实例化类的代理:CsvHelper.CsvContext。 找不到无参数构造函数。 (参数'constructorArguments')'错误。

在下面的行中我收到错误。

 _csvReader.Setup(s =>s.Context.RegisterClassMap<BulkAddUserTemplateModelMap>()).Returns(It.IsAny<BulkAddUserTemplateModelMap>());

这是我需要编写单元测试的代码

public IEnumerable<T> GetListOfRecords<T, M>(string fileContent) where M : ClassMap
    {
        using (var stringReader = new StringReader(fileContent))
        {
            using (var csvReader = _csvHelper.CreateReader(stringReader, CultureInfo.CurrentCulture))
            {
                csvReader.Context.RegisterClassMap<M>();
                var records = csvReader.GetRecords<T>().ToList();
                return records;
            }
        }
    }

下面是单元测试代码

private ICsvHandler _csvHandler;
private Mock<IFactory> _csvHelper;
private Mock<IWriter> _csvWriter;
private Mock<IReader> _csvReader;
private Mock<IStreamWriter> _streamWriter;
private Fixture _fixture;

[SetUp]
public void CsvHanlderTestsSetup()
{
    _csvHelper = new Mock<IFactory>(MockBehavior.Strict);
    _csvWriter = new Mock<IWriter>(MockBehavior.Strict);
    _csvReader = new Mock<IReader>(MockBehavior.Strict);
    _streamWriter = new Mock<IStreamWriter>(MockBehavior.Strict);
    _csvHandler = new CsvHandler(_csvHelper.Object, _streamWriter.Object);
    _fixture = new Fixture();

}

[Test]
public void Should_get_list_of_records()
{
    //arrange
    var fileContent = _fixture.Create<string>();
    IEnumerable<BulkAddUserTemplateModel> expected = new List<BulkAddUserTemplateModel>();

    _csvHelper.Setup(s => s.CreateReader(It.IsAny<StringReader>(), CultureInfo.CurrentCulture)).Returns(_csvReader.Object);
    _csvReader.Setup(s =>s.Context.RegisterClassMap<BulkAddUserTemplateModelMap>()).Returns(It.IsAny<BulkAddUserTemplateModelMap>());
    _csvReader.Setup(s => s.GetRecords<BulkAddUserTemplateModel>()).Returns(expected);
    _csvReader.Setup(p => p.Dispose());

    //act
    var actual = _csvHandler.GetListOfRecords<BulkAddUserTemplateModel, BulkAddUserTemplateModelMap>(fileContent);
    //assert
    actual.Should().Equals(expected);
}
c# .net-core nunit csvhelper
1个回答
0
投票

我们还需要模拟 csvcontext 并在设置中将 reader 或 writer 对象作为参数传递 例如

        _csvContext = new Mock<CsvContext>(_csvReader.Object);

然后在方法中实现

            var fileContent = _fixture.Create<string>();
            IEnumerable<BulkAddUserTemplateModel> expected = _fixture.Create<IEnumerable<BulkAddUserTemplateModel>>();
            var configuration = new CsvConfiguration(CultureInfo.CurrentCulture)
            {
                HasHeaderRecord = true //this seems like a default value, but explicit set is good for readability
            };

            _csvHelper.Setup(s => s.CreateReader(It.IsAny<StringReader>(), CultureInfo.CurrentCulture)).Returns(_csvReader.Object);
            _csvReader.Setup(s => s.Configuration).Returns(configuration);
            _csvReader.Setup(s => s.Context).Returns(_csvContext.Object);
            _csvReader.Setup(s => s.Context.RegisterClassMap<BulkAddUserTemplateModelMap>()).Returns(It.IsAny<BulkAddUserTemplateModelMap>());
            _csvReader.Setup(s => s.GetRecords<BulkAddUserTemplateModel>()).Returns(expected);
            _csvReader.Setup(p => p.Dispose());
var actual = _csvHandler.GetListOfRecords<BulkAddUserTemplateModel, BulkAddUserTemplateModelMap>(fileContent);
© www.soinside.com 2019 - 2024. All rights reserved.