在设置我的模拟来调用函数时,我从 NSubstitute 得到了一种我没有预料到的行为。行为的简化版本是
[Test]
public void NSubstituteTest()
{
var mockedFoo = Substitute.For<IFoo>();
mockedFoo.GenerateString(Arg.Any<string>()).Returns(x => GetValue(x.Args()[0]));
mockedFoo.GenerateString("0").Returns("hi");
string result1 = mockedFoo.GenerateString("0");
string result2 = mockedFoo.GenerateString("1");
Assert.AreEqual("hi", result1);
Assert.AreEqual("1", result2);
}
private string GetValue(object val)
{
string returnValue = val != null ? val.ToString() : "I am null";
System.Diagnostics.Trace.WriteLine(returnValue);
return returnValue;
}
测试通过但我得到输出:0 1
这表明对 mockedFoo.GenerateString("0"); 的调用 实际上导致调用 GetValue() 函数。
如果我对起订量做同样的事情:
[Test]
public void MoqTest()
{
var mockedFoo = new Mock<IFoo>();
mockedFoo.Setup(x => x.GenerateString(It.IsAny<string>())).Returns((object s) => GetValue(s));
mockedFoo.Setup(x => x.GenerateString("0")).Returns("hi");
string result1 = mockedFoo.Object.GenerateString("0");
string result2 = mockedFoo.Object.GenerateString("1");
Assert.AreEqual("hi", result1);
Assert.AreEqual("1", result2);
}
然后我的测试也通过了,但我得到了结果:1
表示该函数未被调用。
这种行为是在某处描述的,还是我以错误的方式设置了一些东西?