为什么代码中没有返回这个模拟值

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

我有一个 dotnet core 6 函数,包含以下几行

var csv = new CsvReader(reader, config))
var records = csv.GetRecords<MyClass>().ToList();

我设置模拟来模拟该函数中的某些对象,以使用

Moq.Mock
获取记录,如下面的代码片段所示。还有其他代码,但这是删减版本。

var myList = new List<MyClass>();
var obj= new MyClass{ ID = "123", Name = "ABC" };
myList.Add(obj);

var csvReaderMock = new Mock<CsvReader>(It.IsAny<StreamReader>(), It.IsAny<CsvConfiguration>());
csvReaderMock.Setup(m => m.GetRecords<MyClass>()).Returns(myList); 

如您所见,我已设置 csvReader 模拟以使用

csvReaderMock.Setup(m => m.GetRecords<MyClass>()).Returns(myList);
返回我的预定义列表,但它不会返回类中的模拟值。

注意:我现在无法更改此行

var csv = new CsvReader(reader, config))
,需要找到解决方法。

unit-testing .net-core mocking moq
1个回答
0
投票

如您所见,我已设置 csvReader 模拟以使用 csvReaderMock.Setup(m => m.GetRecords()).Returns(myList); 返回我的预定义列表,但它不会返回类中的模拟值。

是的,您已经设置了

csvReaderMock
对象,以便它具有在
Setup
方法中指定的特定行为。

这意味着

csvReaderMock.Object
是具有该行为的
CsvReader
对象。该对象将是具有该行为的唯一对象。具体来说,它不会改变其他代码中
csv
对象的行为;该对象是另一个对象。

注意:我现在无法更改此行 var csv = new CsvReader(reader, config)) 并且需要找到解决方法。

如果您无法更改该行,则无法使用 Moq 或大多数其他类似库(FakeItEasy、NSubstitute 等)修改

csv
对象的行为。


技术可以使用不安全且神秘的后门来更改已编译代码的IL,使您能够修改(通过替换)任何IL代码的行为,但我建议不要使用它们。它们往往来来去去,因此您很容易陷入不受支持的商业技术的困境。

使用这样的技术,您的测试也将与实现细节紧密耦合,这意味着每次您更改被测系统中的哪怕是最小的东西时,测试都会中断。那么,拥有测试套件有什么意义呢?

© www.soinside.com 2019 - 2024. All rights reserved.