gpt4 book ai didi

c# - 当我不希望它与 NSubstitute 一起调用函数时

转载 作者:行者123 更新时间:2023-11-30 15:07:08 26 4
gpt4 key购买 nike

在设置我的模拟以调用函数时,我得到了 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;
}

测试通过但我得到输出:01

这表示调用 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

表示函数没有被调用。

是否在某处描述了这种行为,或者我是否以错误的方式设置了一些东西?

最佳答案

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

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

下一个版本将有一个变通方法来解决某些导致问题的情况(尽管不是理想的方法:您需要在设置返回的调用中有一个参数匹配器,以便 NSub 提前知道它不是真正的调用),但必须拦截实际方法调用的基本问题仍然存在。

关于c# - 当我不希望它与 NSubstitute 一起调用函数时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com