gpt4 book ai didi

moq - 使用Moq,您可以验证匿名类型的方法调用吗?

转载 作者:行者123 更新时间:2023-12-03 14:51:33 24 4
gpt4 key购买 nike

我正在尝试使用Moq验证方法调用,但语法不太正确。目前,我已将其作为验证:

repository.Verify(x => x.ExecuteNonQuery("fav_AddFavorites", new
{
fid = 123,
inputStr = "000456"
}), Times.Once());

代码可以编译,但是测试失败并显示以下错误:
Expected invocation on the mock once, but was 0 times: 
x => x.ExecuteNonQuery("fav_AddFavorites", new <>f__AnonymousType0<Int32, String>(123, "000456"))
No setups configured.

Performed invocations:
IRepository.ExecuteNonQuery("fav_AddFavorites", { fid = 123, inputStr = 000456 })

如何验证方法调用并匹配匿名类型的方法参数。

更新

回答问题:

我正在尝试验证方法是否已调用以及参数是否正确。

我要验证的方法的签名是:
int ExecuteNonQuery(string query, object param = null);

设置代码很简单:
repository = new Mock<IRepository>();

更新2

看来,这是Moq的问题,以及它如何处理.Net中的匿名类型。 Paul Matovich发布的代码运行正常,但是,一旦代码和测试位于不同的程序集中,则测试将失败。

最佳答案

通过

        public class Class1
{
private Class2 _Class2;
public Class1(Class2 class2)
{
_Class2 = class2;
}

public void DoSomething(string s)
{
_Class2.ExecuteNonQuery(s, new { fid = 123, inputStr = "000456" });
}
}

public class Class2
{
public virtual void ExecuteNonQuery(string s, object o)
{
}
}

/// <summary>
///A test for ExecuteNonQuery
///</summary>
[TestMethod()]
public void ExecuteNonQueryTest()
{
string testString = "Hello";
var Class2Stub = new Mock<Class2>();
Class1 target = new Class1(Class2Stub.Object);
target.DoSomething(testString);
Class2Stub.Verify(x => x.ExecuteNonQuery(testString, It.Is<object>(o => o.Equals(new { fid = 123, inputStr = "000456" }))), Times.Once());
}

更新资料

奇怪的是,它不适用于不同的程序集。有人可以给我们一个长定义,说明为什么来自不同程序集的object.equals行为不同,但是对于不同的程序集,这将起作用,对象值中的任何差异都将返回不同的哈希码。
        Class2Stub.Verify(x => x.ExecuteNonQuery(testString, It.Is<object>(o => o.GetHashCode() == (new { fid = 123, inputStr = "000456" }).GetHashCode())), Times.Once());

关于moq - 使用Moq,您可以验证匿名类型的方法调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9892362/

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