使用模拟框架来验证行为
当需要验证被测系统和测试双打之间的相互作用时,使用模拟。需要注意避免创建过于脆弱的测试,但是当测试方法只是编排其他调用时,模拟可能特别有用。
该测试验证当调用被测方法(ProcessRecord
)时,为 Record
调用服务方法(UseValue
)。为此,它使用固定数据设置存根:
var stub = new Mock<IRecordProvider>();
stub.Setup(provider => provider.GetRecords()).Returns(new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
});
然后它设置了一个实现 IService
接口的模拟:
var mockService = new Mock<IService>();
mockService.Setup(service => service.UseValue(It.IsAny<string>())).Returns(true);
然后将它们提供给被测系统,并调用要测试的方法。
var sut = new SystemUnderTest(mockService.Object);
var processed = sut.ProcessRecord(stub.Object);
然后可以询问模拟以验证已经对其进行了预期的调用。在这种情况下,调用 UseValue
,其中一个参数为 Second
,这是记录所在的 Flag==true
的值。
mockService.Verify(service => service.UseValue("Second"));