C# 验证是否使用Moq调用了委托

C# 验证是否使用Moq调用了委托,c#,unit-testing,delegates,moq,C#,Unit Testing,Delegates,Moq,我有一个类,它通过参数获得一个委托。 这个类调用那个委托,我想用Moq对它进行单元测试。 如何验证是否调用了此方法 示例类: public delegate void Foo(int number); public class A { int a = 5; public A(Foo myFoo) { myFoo(a); } } 我想检查一下Foo是否被叫来了。 谢谢。Moq不支持模拟学员。但您可以使用方法创建一些与您的代理签名匹配的接口: public

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

示例类:

public delegate void Foo(int number);

public class A
{
   int a = 5;

   public A(Foo myFoo)
   {
      myFoo(a);
   }
}
我想检查一下Foo是否被叫来了。
谢谢。

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));   
Mock bar=new Mock();
Foo-Foo=新的Foo(bar.Object.M);
A=新的A(foo);
验证(x=>x.M(5));
在练习sut之后,您将能够验证对模拟对象的期望


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

您可以这样做:

 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())
公共接口方法
{
无效食品验证方法(整数);
}
Mock myMock=新建Mock();
A=新A(myMock.Object.FooAlikeMethod);
myMock.Verify(call=>call.Foo(It.IsAny()),Times.Once())

由于Moq不支持模拟代理,我通常会使用以下方法处理此问题:

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

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

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

bool isDelegateCalled = false;
var a = new A(a => { isDelegateCalled = true});

//do something
Assert.True(isDelegateCalled);
截至目前,Moq支持模拟学员,针对您的情况,您可以这样做:

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

fooMock.Verify(f=>f(It.IsAny()),Times.one);

仅供参考,Moq现在支持模拟代理查看我的答案,仅供参考,Moq现在支持模拟代理查看我的答案,我认为您需要更改已接受的答案,因为@Lukazoid的答案比您的选择更正确。在构造函数中,该行是否应为
myFoo(a)
?您正在调用
Foo
的实例,而不是
Foo
类本身,对吗?很好,但是。。。这个问题特别询问了最低起订量。@rsenna如果你阅读了下面的答案,你会发现当我发布我的答案时,最低起订量中不支持这个问题。我为OP试图做的验证提供了一个解决方案。OP可能也发现这是足够的,这也是很好的。但这并没有改变这样一个事实,即它并没有解决我的问题——这可以用这个问题中的同一个标题来描述::-)不知怎的,这个帖子让我笑了:D我希望你们在编写代码时也能玩得开心:D
fooMock.Verify(f => f(5), Times.Once);
fooMock.Verify(f => f(It.IsAny<int>()), Times.Once);