gpt4 book ai didi

moq - 使用 Moq 使用 ref 参数验证调用

转载 作者:行者123 更新时间:2023-12-01 08:28:57 30 4
gpt4 key购买 nike

如何验证是否使用 Moq 调用了“CallWithRef”方法?

public interface ITest
{
void CallWithoutRef(string value, List<string> errors);
void CallWithRef(string value, ref List<string> errors);
}

public class Foo
{
private ITest testInterface;

public Foo(ITest testInterface)
{
this.testInterface = testInterface;
}

public void DoStuff(string value)
{
var errorList = new List<string>();
testInterface.CallWithoutRef(value, errorList);
testInterface.CallWithRef(value, ref errorList);
}
}

[TestMethod]
public void VerifyTestInterfaceCalls()
{
var expectedValue = Path.GetRandomFileName();
var mockTestInterface = new Mock<ITest>();
var foo = new Foo(mockTestInterface.Object);

foo.DoStuff(expectedValue);
mockTestInterface.Verify(x => x.CallWithoutRef(expectedValue, It.IsAny<List<string>>()));

// Test fails here:
var errorList = It.IsAny<List<string>>();
mockTestInterface.Verify(x => x.CallWithRef(expectedValue, ref errorList));
}

最佳答案

这在 Moq 4.8.0 中变得更好,有关 It.Ref 的详细信息,请参见此处的其他答案。 !

调用 Verify在 Moq 中对 ref 执行严格的相等性检查论据。当参数是引用类型(如您的示例中)时, argument matcher that Moq uses仅当实际值和预期值是相同的引用时才成功。这是因为它使用 object.ReferenceEquals(expected, actual)来验证相等性。

Moq Quickstart 中提到了这种行为(尽管它可能更彻底一些)。 :

// ref arguments
var instance = new Bar();
// Only matches if the ref argument to the invocation is the same instance
mock.Setup(foo => foo.Submit(ref instance)).Returns(true);

在您的示例中, It.IsAny<List<string>>()实际返回 default(T)最后,你在比较 nullList<string> 的新实例创建于 DoStuff ,根据匹配器的实现将失败。

这显然是一个玩具示例,所以我不能建议您应该做什么,但是如果您修改 DoStuff要接受列表而不是创建自己的列表,您可以像这样测试它:
var errorList = It.IsAny<List<string>>(); 
// var errorList = new List<string>(); // also works

foo.DoStuff(expectedValue, errorList);

mockTestInterface.Verify(x => x.CallWithoutRef(expectedValue, It.IsAny<List<string>>()));
mockTestInterface.Verify(x => x.CallWithRef(expectedValue, ref errorList));

关于moq - 使用 Moq 使用 ref 参数验证调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25785922/

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