验证是否使用最小起订量调用了委托

本文关键字:调用 是否 验证 | 更新日期: 2023-09-27 18:36:51

>我得到了一个通过参数获得委托的类。这个类调用该委托,我想用 Moq 对其进行单元测试。如何验证是否调用了此方法?

示例类 :

public delegate void Foo(int number);
public class A
{
   int a = 5;
   public A(Foo myFoo)
   {
      myFoo(a);
   }
}

我想检查一下 Foo 是否被调用。谢谢。

验证是否使用最小起订量调用了委托

截至此提交,Moq 现在支持对代表的嘲笑,对于您的情况,您可以这样做:

var fooMock = new Mock<Foo>();
var a = new A(fooMock.Object);

然后,您可以验证是否已调用委托:

fooMock.Verify(f => f(5), Times.Once);

或:

fooMock.Verify(f => f(It.IsAny<int>()), Times.Once);

使用匿名函数怎么样?它可以像这里的内联模拟一样,你不需要模拟框架。

bool isDelegateCalled = false;
var a = new A(a => { isDelegateCalled = true});
//do something
Assert.True(isDelegateCalled);

你可以做这样的事情:

 public interface IWithFOOMethod
 {
     void FooAlikeMethod(int number);
 }
 Mock<IWithFOOMethod> myMock = new Mock<IWithFOOMethod>();
 A a = new A(myMock.Object.FooAlikeMethod);
 myMock.Verify(call => call.Foo(It.IsAny<int>()), Times.Once())

Moq 不支持模拟代表。但是,您可以使用方法创建一些与您的委托签名匹配的接口:

public interface IBar
{
    void M(int number);
}

然后创建 mock,它实现此接口,并使用此 mock 对象创建委托:

Mock<IBar> bar = new Mock<IBar>();
Foo foo = new Foo(bar.Object.M); 
A a = new A(foo);
bar.Verify(x => x.M(5));   

锻炼后,您将能够验证对模拟对象的期望。

更新:实际上,您可以简单地将bar.Object.M传递给您的sut,而无需创建委托实例Foo。但无论如何,模拟委托需要创建接口。

由于 Moq 不支持模拟代表,我通常会这样处理:

var list = new List<int> ();
var del = i => list.Add (i);
var a = new A(del);
list.ShouldContainOnly (new[] { 5 });

其中提供的委托执行一些简单、可验证的操作。