gpt4 book ai didi

c# - 是否可以将 C# 事件处理程序推迟到其他处理程序被调用之后?

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:53 25 4
gpt4 key购买 nike

在 C# 中测试事件驱动代码时,我想确保我的断言在被测对象有机会处理事件之前不会执行。目前,我正在使用 AutoResetEvent 对象来暂停执行,直到像这样触发一个事件:

private MyClassDependency testObjectDependency = new MyClassDependency();
private MyClass testObject = new MyClass(testObjectDependency);
private AutoResetEvent eventLock = new AutoResetEvent(false);

void handle(object sender, EventArgs e)
{
eventLock.Set();
}

[Test()]
public void DoSomethingTest()
{
testObjectDependency.Event += handle;
testObject.DoSomething();
eventLock.WaitOne();
testObjectDependency.Event -= handle;
testObject.IsSomethingDone.Should().Be.True();
}

在运行调试器时,我在测试事件处理程序和 testObject 的事件处理程序中设置了断点,我可以看到测试处理程序首先触发,然后是我尝试触发的处理程序测试开始,然后测试在真正的处理程序完成之前失败。

我应该如何更改此设置,以便在调用所有其他处理程序之前不会调用测试中的处理程序?我正在使用 Visual Studio 2013、.NET 4.0 客户端、NUnit 2.6.3 和 Should.Fluent 1.0。

这个问题有点类似于this previous one , 除了这里我想保证所有其他事件处理程序首先完成。

编辑:

感谢一些有用的评论,我回到我的代码并意识到问题出在我的测试设置中。这是我原来的设置代码:

[SetUp]
public void SetupDeviceController()
{
dev = new TestDevice();
dc = new DeviceController(dev);
dev.Read += dev_Read;
dc.Open();
}

匹配的 dev.Read -= dev_Read; 出现在 [TearDown] 方法中。

最佳答案

好的,所以,在发布上面的示例代码时,我掩盖了问题的真正根源。在我的实际测试代码中,我有一个 SetUp 方法,它实例化一个模拟依赖对象,然后将模拟对象作为对真实被测对象的依赖注入(inject)。然后,我在调用添加真实处理程序的真实对象方法之前将我的测试处理程序添加到模拟对象。这是我真正的设置代码:

[SetUp]
public void SetupDeviceController()
{
dev = new TestDevice();
dc = new DeviceController(dev);
dev.Read += dev_Read;
dc.Open();
}

我把它改成了:

[SetUp]
public void SetupDeviceController()
{
dev = new TestDevice();
dc = new DeviceController(dev);
dc.Open();
dev.Read += dev_Read;
}

现在处理程序按预期顺序运行。

关于c# - 是否可以将 C# 事件处理程序推迟到其他处理程序被调用之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24287304/

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