使用nunit测试使用模拟处理事件

时间:2010-06-20 15:16:02

标签: c# unit-testing events nunit mocking

我需要创建一些单元测试,确认类的实例对另一个对象引发的事件做出适当的响应。通过模拟“观察”的对象很容易,但据我所知,nunit中的模拟不提供模拟引发事件的方法。

我正在考虑使用反射直接调用我正在测试的对象上的事件处理程序,将对mock的引用作为'sender'传递,但是这并没有有效地测试我的对象是否正确地将事件挂钩第一个地方(虽然现在我想到了,但这应该可以单独测试)。

看起来确实有点像黑客,但我看不到另一种做法;有没有更好的办法?此外,模拟是否可以检查事件是否被挂钩?

2 个答案:

答案 0 :(得分:1)

我使用Rhino Mocks来创建模拟,它们可以非常好地处理事件: http://ayende.com/Wiki/Default.aspx?Page=Rhino+Mocks+Events&AspxAutoDetectCookieSupport=1

答案 1 :(得分:1)

RhinoMock代码非常适合验证订阅是否正在发生,或者用于验证事件是否已经引发,但对于自己引发事件并不是那么好。

我有类似的问题。我通过编写自己的实现聚合器接口的小存根类来解决它,并允许我从测试中引发一个事件。有时编写自己的测试代码比使用模拟框架更容易,而模拟框架实际上并不是为此而设计的。

只有当事件挂钩到事件并且对它们做出响应时,你的类的行为才有价值,所以我认为单独测试它们并不重要。