使用模擬框架來驗證行為

當需要驗證被測系統和測試雙打之間的相互作用時,使用模擬。需要注意避免建立過於脆弱的測試,但是當測試方法只是編排其他呼叫時,模擬可能特別有用。

該測試驗證當呼叫被測方法(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"));