【问题标题】:Testing event handling with mocks using nunit使用 nunit 使用模拟测试事件处理
【发布时间】:2010-06-20 15:16:01
【问题描述】:

我需要创建一些单元测试来确认一个类的实例能够适当地响应另一个对象引发的事件。传递“被监视”对象的模拟很容易,但据我所知,nunit 中的模拟不提供让模拟引发事件的方法。

我正在考虑使用反射直接调用我正在测试的对象上的事件处理程序,将模拟的引用作为“发送者”传递,但这并不能有效地测试我的对象是否正确地将事件挂钩第一名(虽然现在想想,这应该还是单独测试吧)。

这看起来有点像 hack,但我看不出另一种方法;有没有更好的办法?另外,mock 是否可以检查事件是否已被钩住?

【问题讨论】:

    标签: c# unit-testing events nunit mocking


    【解决方案1】:

    RhinoMock 代码非常适合用于验证订阅是否发生或用于验证是否引发了事件,但对于引发事件本身则不是很好。

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

    只有当你的类的行为挂钩到事件并且响应它们时,你的类的行为才有价值,所以我认为单独测试这些没有多大意义。

    【讨论】:

    • 我猜我最初的问题的答案是一个简单的“不”,尽管我应该指定我几乎受到 nunit 模拟的情况的限制。看起来我将不得不使用存根选项。
    【解决方案2】:

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

    【讨论】:

    • 酷,从来没有注意到 Rhino 可以做到这一点;不幸的是,我需要在这种情况下使用 nUnit。
    • 嗨@Flynn1179,NUnit?通常你会在 NUnit 之上使用 Rhino Mocks。你在使用 NUnit 自带的 mocking 框架吗?
    • 是的;然而,鉴于我们目前所有的测试都没有使用 Rhino,我很难说服我的团队/老板使用 Rhino 进行一些测试并使用 nUnit 的 mock 进行其他测试,或者完全切换到 Rhino。
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多