Moq使用“m => m.FooEvent + = null”是什么意思?

时间:2017-06-29 03:03:53

标签: c# moq

mock.Raise中第一个参数背后的含义是什么?我认识到它是一个lambda,但我不确定为什么Moq需要一个试图将null EventHandler添加到事件的lambda。

// Raising an event on the mock
mock.Raise(m => m.FooEvent += null, new FooEventArgs(fooValue));

1 个答案:

答案 0 :(得分:2)

  

要从模拟对象引发事件,我们使用其Raise方法。这个   接受两个参数。第一个是lambda表达式,包括   要引发事件的空事件订阅者。虽然不是   最优雅的语法,这是允许Moq了解如何   事件被使用。第二个参数提供事件参数   这将包含在活动中。

取自here

如果我们在moq source code中查看Raise方法,它的签名如下:

public void Raise(Action<T> eventExpression, EventArgs args);

它将使用Action<T>来标识我们想要引发的事件(使用反射),我们使用lambda表达式指定此事件,该表达式被评估为某种委托(Action<T>)。 />

更好的语法看起来像这样:

mock.Raise(m => m.FooEvent, new FooEventArgs(fooValue));

但是这个lambda不会编译,因为它不是Action<T>,考虑这个方法是我们的​​lambda等价物:

public void Baz(SomeMock m)
{
    m.FooEvent;
}

它的签名似乎是有效的,它有一个输入,没有输出,例如Action<T> 但是这个方法不能编译,你不能访问一个事件(或任何没有对它做一些操作(set,get等等)它在C#语法中不受支持,因为moq编写者需要寻找替代方案并且他们选择使用null事件处理程序注册作为允许编译此lambda的解决方法:

m.FooEvent += null