|
|
1
4
你能做的最简单的事情就是向事件订阅一个匿名方法或lambda,并在其中递增一个测试本地的计数器。根本不需要使用额外的类。 我发现这不会使你的代码非常可读,所以我也做了同样的事情。我在几个项目中编写了监控对象。通常它们比你的显示器更通用。它们只是公开了您可以订阅事件的公共方法,并计算了它们被调用的次数。这样,您就可以为不同的事件重用监视对象。 大致如下:
问题在于,它并不是真正通用的。您只能测试监视的事件。EventCatcher()可以订阅。我通常不处理带参数的事件,所以这没问题,我只使用标准的void EventCatcher,即对象发送方和ViewModel参数。您可以通过将正确类型的lambda订阅到事件中并在lambda中调用EventCatcher来使其更通用。这使得你的测试有点难以阅读。您还可以使用泛型使EventCatcher方法与泛型EventHandler一起工作。 您可能需要注意,最终您将希望能够准确存储以什么顺序和用什么参数调用的事件。你的事件监视器很容易失控。 我找到了另一种方法,这种方法可能对具有更复杂断言的测试有意义。 与其创建自己的监视器,不如让你选择的模拟框架为你创建它,你只需为处理事件的类创建一个接口。大致如下:
然后,您可以在测试中模拟此接口。Rhino Mocks这样做:
对于这样一个简单的测试,它可能有点过头了,但如果你想断言关于参数的事情,例如,你可以使用你的模拟框架的灵活性。 另一方面 Rob和我正在开发一个通用的事件测试监视器类,这可能会使其中一些更容易。如果人们有兴趣使用这样的东西,我想听听你的意见。 |
|
|
2
2
我最近写了一系列关于发布同步和异步事件的对象的单元测试事件序列的博客文章。这些帖子描述了一种单元测试方法和框架,并提供了完整的测试源代码。 我描述了一个“事件监视器”的实现,其概念与你所描述的和之前一些回答这个问题的人提到的类似。这绝对是朝着正确的方向发展的,因为在没有某种监控模式的情况下编写大量测试会导致大量混乱的样板代码。 使用我文章中描述的事件监视器,测试可以这样编写:
EventMonitor完成所有繁重的工作,并将运行测试(test),并断言事件是按照预期的顺序(expectedSequence)引发的。它还可以在测试失败时打印出漂亮的诊断消息。与所讨论的一些方法不同的是,它不仅会计数,还会断言遵循了指定的确切顺序。此外,您不需要勾选任何事件。所有这些都由事件监视器处理。因此,测试非常干净。 在描述问题和方法的帖子中有很多细节,还有源代码: http://gojisoft.com/blog/2010/04/22/event-sequence-unit-testing-part-1/ |
|
|
3
1
一个需要改进的漏洞/空间是,您的监视器只计算引发的事件数量。理想情况下,人们可以指定应该引发哪些事件、多少次、以何种顺序,甚至可能指定在引发每个事件时(对象发送者,nvarchar e)对应该是什么样子。 |
|
|
4
1
我通常使用Mock对象来测试事件——当我在Java中工作时,我使用EasyMock(你选择的语言应该也有类似的东西):
在我看来,你所做的事情听起来更像是一个Stub——也就是说,监听器/观察者不知道应该多久调用一次,而只是计算调用次数,然后测试根据该计数进行断言。这也是一个合理的解决方案,你更喜欢哪一个主要是个人偏好的问题,而且你的语言和可用工具可能会使哪种解决方案更容易。 |
|
|
5
0
在我看来很好——因为它有效;-) |
|
|
6
0
我做测试赛。我做这件事的方法很简单。
|
|
|
7
0
在我的测试类中,我只是将事件处理程序与声明的对象的事件挂钩。…还是我错过了什么?? |