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

Jon*_*Jon 3 c# unit-testing nsubstitute

在设置我的模拟调用函数时,我得到了一个我从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;
}
Run Code Online (Sandbox Code Playgroud)

测试通过,但我得到输出:0 1

这表明调用了mockedFoo.GenerateString("0"); 实际上会导致调用GetValue()函数.

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

[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);
}
Run Code Online (Sandbox Code Playgroud)

然后我的测试也通过但我得到了结果:1

表示未调用该功能.

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

Dav*_*pak 5

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

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

下一个版本将有一个变通的某些情况下,这是造成问题(尽管是不理想的一个:你必须是设置返回的调用的参数匹配,从而NSUB事先知道这是不是一个实际调用),但必须拦截实际方法调用的基本问题仍然存在.