当我不期望它与NSubstitute一起调用函数时

在设置我的模拟调用函数时,我得到了一个我从NSubstitute没想到的行为。 行为的简化版本是

[Test] public void NSubstituteTest() { var mockedFoo = Substitute.For(); mockedFoo.GenerateString(Arg.Any()).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()函数。

如果我对Moq做同样的事情:

 [Test] public void MoqTest() { var mockedFoo = new Mock(); mockedFoo.Setup(x => x.GenerateString(It.IsAny())).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

指示该function未被调用。

这种行为是在某处描述的,还是我可能以错误的方式设置某些内容?

这是NSubstitute如何工作的副作用:要获得实际调用方法以获取对该方法的引用所需的特定语法。

Moq和其他人使用lambda,可以从那里选择特定的方法,而无需运行方法本身。 (这意味着NSubstitute也无法检测或抛出非虚方法调用。)

下一个版本将针对某些导致问题的情况进行解决(虽然这是一个非理想的问题:你需要在调用中设置一个参数匹配器来设置返回值,因此NSub事先知道它不是实际调用),但必须拦截实际方法调用的基本问题仍然存在。