Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Moq验证接受委托参数的基类中的方法调用_C#_Unit Testing_Delegates_Mocking_Moq - Fatal编程技术网

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);