我有一个 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))
,需要找到解决方法。
如您所见,我已设置 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代码的行为,但我建议不要使用它们。它们往往来来去去,因此您很容易陷入不受支持的商业技术的困境。
使用这样的技术,您的测试也将与实现细节紧密耦合,这意味着每次您更改被测系统中的哪怕是最小的东西时,测试都会中断。那么,拥有测试套件有什么意义呢?