【问题标题】:Moq: How to raise an event with non-null sender起订量:如何使用非空发件人引发事件
【发布时间】:2017-02-19 03:28:27
【问题描述】:

考虑这个交互:

public interface IFoo
{
   event EventHandler SomethingHappened;
}

使用 Moq,我模拟了界面,现在我想引发事件:

var myMock = new Mock<IFoo>();
myMock.Raise(x => x.SomethingHappened += null, EventArgs.Empty );

这很好用,但问题是订阅者希望 sender 是某个东西(实际上是引发事件的 IFoo),而不仅仅是 null。

因此我想像这样提出这个事件:

myMock.Raise(x => x.SomethingHappened += myMock.Object, EventArgs.Empty );

但编译器不允许这样做 - 它似乎只接受 null 作为发送者。这是为什么?有没有办法做我真正想做的事?

【问题讨论】:

  • 你得到什么错误?还有SomethingHappened的签名是什么?
  • 试试myMock.Raise(x=&gt;x.SomethingHappened += null,myMock.Object, EventArgs.Empty );x=&gt;x.SomethingHappened += null,这将告诉 Mock,要引发哪个事件,rest 是预期的参数

标签: c# events moq raise


【解决方案1】:

您可以将 (object sender,EventArgs e) 传递给SomethingHappened,如下所示,这会让订阅者知道发件人是您的IFoo moq 对象

myMock.Raise(x=>x.SomethingHappened += null,myMock.Object, EventArgs.Empty );

【讨论】:

  • 嘿,这行得通 - 谢谢,伙计!似乎我对空值感到困惑。我假设 null 作为 sender 参数传输,但显然情况并非如此。但是空值是什么意思呢?为什么需要它?
  • 您需要首先了解发生这种情况的原因,以及如果您注意到,我提前在 cmets 中评论了答案。检查我的回答并询问您可能有的任何疑问
【解决方案2】:

假设您使用.Net 4.5EventHandler&lt;TEventArgs&gt; 委托的定义发生了变化,请检查4.54.0 的链接,这可以确保尽管您使用的是IFoo 类型,这可能无法从EventArgs 分配,但编译器仍然不会像 4.0 中那样抱怨,但另一方面是 Moq 框架会将事件视为标准委托而不是事件模式,需要将其称为:

myMock.Raise(x=&gt;x.SomethingHappened += null,myMock.Object, EventArgs.Empty);

x.SomethingHappened += null,它告诉 Moq 框架,调用和休息哪个事件/委托将是 object sender, EventArgs e 形式的标准参数

【讨论】:

  • 非常感谢您的精彩解释 :-)。是的,我使用的是 .Net 4.5。
  • 欢迎您,请您接受正确完整的答案。
猜你喜欢
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多