有什麼區別我正在使用Moq並希望創建生成器類以創建我的模擬與預設合理的默認值,可以根據需要在測試設置期間被覆蓋。我採取的方法使用擴展方法,其中我傳遞輸入參數值和期望的輸出。在這樣做的過程中,我看到不同的行爲在我看來是語義上等同的代碼:直接在設置中傳遞It.IsAny(),或在設置中間接傳遞It.IsAny()的值。例如:通過It.IsAny <int>()和它的值It.IsAny <int>()對方法設置
public interface IFoo
{
bool Bar(int value);
bool Bar2(int value);
}
public class Foo : IFoo
{
public bool Bar(int value) { return false; }
public bool Bar2(int value) { return false; }
}
var mock = new Mock<IFoo>();
mock.Setup(x => x.Bar(It.IsAny<int>())).Returns(true);
Assert.IsTrue(mock.Object.Bar(123)); // Succeeds
var myValue = It.IsAny<int>();
mock.Setup(x => x.Bar2(myValue)).Returns(true);
Assert.IsTrue(mock.Object.Bar2(123)); // Fails
兩個調用是等價的(對我來說),但調用失敗BAR2斷言。爲什麼是這樣?
非常好的解釋,本。正如你所描述的那樣,我懷疑問題在於表達式評估,而不是It.IsAny的返回值()。我在ILSpy中查看了反射源,並可以看到它。但是無法讓我的腦袋圍繞它如何解決問題。 再次感謝您的解釋。 –
感謝您爲我清理巫術!我試圖說「var anyFooParam = It.IsAny(); var anyBarParam = It.IsAny ();」看看它是否會讓我的測試更具可讀性,例如:.Setup(mock => mock.method(anyFooParam,anyBarParam))。Returns(something!) –