C# 使用Moq验证接受委托参数的基类中的方法调用
我试图测试是否调用了一个方法,并且该方法存在于被测试类的基类中 当我使用一个简单的字符串参数运行下面的示例时,它可以工作,但当有一个委托参数时,测试失败 我创建了下面的示例来演示这个问题。如果在C# 使用Moq验证接受委托参数的基类中的方法调用,c#,unit-testing,delegates,mocking,moq,C#,Unit Testing,Delegates,Mocking,Moq,我试图测试是否调用了一个方法,并且该方法存在于被测试类的基类中 当我使用一个简单的字符串参数运行下面的示例时,它可以工作,但当有一个委托参数时,测试失败 我创建了下面的示例来演示这个问题。如果在SomeMethod中取出委托参数并在测试中,测试将通过 失败代码: 整个错误消息: 测试方法UnitTestProject1.Tests.TestMethod1引发异常: 最小起订量例外情况: 预期至少对模拟调用一次,但从未执行过:x=>x.SomeMethod(“foo”,()=>True) 未配置任
SomeMethod
中取出委托参数并在测试中,测试将通过
失败代码:
整个错误消息:
测试方法UnitTestProject1.Tests.TestMethod1引发异常:
最小起订量例外情况:
预期至少对模拟调用一次,但从未执行过:x=>x.SomeMethod(“foo”,()=>True)
未配置任何设置。
执行的调用:
BaseClass.SomeMethod(“foo”,System.Func`1[System.Boolean])
在Moq.Mock.ThrowVerifyException(应为MethodCall,IEnumerable`1设置,IEnumerable`1实际调用,表达式表达式,时间,Int32调用计数)
在Moq.Mock.VerifyCalls(拦截器targetInterceptor,应为MethodCall,表达式,时间)
在Moq.Mock.Verify(Mock`1 Mock,表达式`1 Expression,Times,String failMessage)
在Moq.Mock`1.验证(表达式`1表达式,次)
在Moq.Mock`1.Verify(表达式`1表达式,函数`1次)
在UnitTest1.cs中的UnitTestProject1.Tests.TestMethod1()处:第16行
如果我将测试更改为以下,则它将通过。请参见我将()=>true
更改为It.IsAny()
,这意味着可以使用任何Func调用它。你在乎它的()=>是否为真吗
var test = new Mock<DerivedClass>();
test.Object.DoSomething();
test.Verify(x => x.SomeMethod("foo", It.IsAny<Func<bool>>()), Times.AtLeastOnce);
var测试=新建模拟();
test.Object.DoSomething();
test.Verify(x=>x.SomeMethod(“foo”,It.IsAny()),Times.atleastone);
谢谢。这个例子只是一个简单的例子来说明这个问题。你的回答激发了解决实际问题的灵感。我还没有足够的代表投票支持你的答案。@这个答案正确的原因是两个代表Func d1=()=>true代码>和Func d2=()=>true
不需要比较equal,即d1。Equals(d2)
可以返回false
。有关目标方法(和非静态方法的目标实例)必须相同的说明,请参见。然而,()=>true
可能会创建一个新的“real”方法,即使其他地方已经存在另一个()=>true
。在这里,两个lambda甚至在不同的类中。其中一个在表达式树中。
public abstract class BaseClass
{
public virtual void SomeMethod(string someString)
{
//do something
}
}
public class DerivedClass : BaseClass
{
public void DoSomething()
{
SomeMethod("foo");
}
}
[TestClass]
public class Tests
{
[TestMethod]
public void TestMethod1()
{
var test = new Mock<DerivedClass>();
test.Object.DoSomething();
test.Verify(x => x.SomeMethod("foo"), Times.AtLeastOnce);
}
}
var test = new Mock<DerivedClass>();
test.Object.DoSomething();
test.Verify(x => x.SomeMethod("foo", It.IsAny<Func<bool>>()), Times.AtLeastOnce);