gpt4 book ai didi

unit-testing - 从对象测试事件

转载 作者:行者123 更新时间:2023-11-28 20:02:37 24 4
gpt4 key购买 nike

我一直在努力深入了解 TDD。目前在控制台应用程序中使用大量 Debug.Asserts 来保持简单。

我想完成的部分测试是确保从对象引发事件的次数正确,因为客户端代码将依赖于这些事件。

因此,我开始考虑如何测试正在引发的事件,以及如何跟踪它们。所以我想到了一个Monitor“模式”(如果你可以这样调用它的话)。这基本上是一个在其构造函数中采用被测类型对象的类。

然后事件被连接到监视器,创建的委托(delegate)在事件发生时进行计数和记录。

然后我回到我的测试代码并执行如下操作:

    bool Test()
{
MyObject mo = new MyObject();
MyMonitor mon = new MyMonitor(mo);

// Do some tests that should cause the object to raise events..

return mon.EventCount == expectedCount;
}

这工作正常,当我故意破坏我的代码时,测试按预期失败了,但我想知道,这是不是太多了“自由形式”测试代码(即不支持测试的代码)?


其他想法

  • 你测试事件吗?
  • 您如何测试事件?
  • 您认为以上内容是否有任何不足/改进的余地?

感谢收到所有输入! ^_^

最佳答案

您可以做的最简单的事情是为事件订阅一个匿名方法或 lambda,并在其中递增一个本地测试的计数器。根本不需要使用额外的类。

我发现这不会使您的代码具有可读性,所以我做了同样的事情。我在几个项目中编写了监控对象。通常它们比您的显示器更通用。它们只是公开您可以订阅事件的公共(public)方法,并且它们会计算它们被调用的次数。这样您就可以为不同的事件重用监视器对象。

像这样:

MyObject subjectUnderTest = new MyObject();
EventMonitor monitor = new Monitor();
subjectUnderTest.Event += monitor.EventCatcher;

// testcode;

Assert.Equal( 1, monitor.EventsFired );

问题是它不是真正通用的。您只能测试可以订阅 monitor.EventCatcher() 的事件。我通常不使用参数来处理事件,所以这没问题,我只有标准的 void EventCatcher(object sender, EventArgs arguments)。您可以通过为事件订阅正确类型的 lambda 并在 lambda 中调用 EventCatcher 来使其更通用。不过,这会使您的测试更难阅读。您还可以使用泛型使 EventCatcher 方法与泛型 EventHandler 一起工作。

您可能需要注意,最终您会希望能够准确存储以何种顺序和使用何种参数调用了哪些事件。您的事件监视器很容易失控。


我发现了另一种方法,它可能对具有更复杂断言的测试有意义。

不是创建自己的监视器,而是让您选择的模拟框架为您创建它,您只需为处理事件的类创建一个接口(interface)。像这样:

public interface IEventHandlerStub
{
event EventHandler<T> Event(object sender, T arguments);
}

然后你可以在你的测试中模拟这个接口(interface)。 Rhino Mocks 是这样做的:

var eventHandlerStub = MockRepository.GenerateStub<IEventHandlerStub>();
myObject.Event += eventHandlerStub.Event;

// Run your code

eventHandlerStub.AssertWasCalled(x => x.Event(null, null));

对于像这样的简单测试,它可能有点矫枉过正,但如果您想对参数进行断言,例如您可以使用模拟框架的灵 active 。

另一个笔记。 Rob 和我正在研究一个通用的事件测试监视器类,它可能会使其中的一些更容易。如果人们有兴趣使用这样的东西,我想听听你的意见。

关于unit-testing - 从对象测试事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/334095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com