Moq验证事件已触发

jam*_*o00 14 c# moq

class A
{
    event EventHandler Event1;
}
var mock = new Mock<A>();
Run Code Online (Sandbox Code Playgroud)

如何验证Event1被解雇?(不使用手动事件处理程序/触发标志)

Teo*_*gul 22

var mock = new Mock<IInterfaceWithEvent>();
mock.Raise(e => e.MyEvent += null, EventArgs.Empty);
mock.VerifyAll();
Run Code Online (Sandbox Code Playgroud)

或者如果您想确保该行为引发事件,您的设置应如下所示:

mock.Setup(foo => foo.Submit()).Raises(f => f.Sent += null, EventArgs.Empty);
// ...
mock.VerifyAll();
Run Code Online (Sandbox Code Playgroud)


Kal*_*son 22

我不确定我真的明白你为什么这么问.如果你有Mock<A>,那么你控制模拟,那么为什么要验证它已经做了你控制的事情?

也就是说,虽然我确实使用了Moq的加注/加注,但我仍然经常使用带有lambda的标志,我觉得相当干净:

bool eventWasDispatched = false; // yeah, it's the default
var a = new A();
a.Event1 += () => eventWasDispatched = true;
a.DoSomethingToFireEvent();
Assert.IsTrue(eventWasDispatched);
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,但请记住,如果事件遵循标准(发送者,EventArgs)模式,那么您将需要相应地调整lambda:`a.Event1 + =(sender,args)=> eventWasDispatched = true; ` (8认同)