mock.Raise中第一个参数背后的含义是什么?我认识到它是一个lambda,但我不确定为什么Moq需要一个试图将null EventHandler添加到事件的lambda。
// Raising an event on the mock
mock.Raise(m => m.FooEvent += null, new FooEventArgs(fooValue));
答案 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