gpt4 book ai didi

C# 和 Moq - 如何断言未引发事件

转载 作者:行者123 更新时间:2023-11-30 15:02:48 25 4
gpt4 key购买 nike

我有一个根据 Sim 对象的状态引发事件的应用程序。特别是,如果 Sim 的状态发生变化 - 即从 PinRequired 变为 Accessible - 将引发 OnStatus 事件。事件通知新线程上的监听器。

我在我的单元测试中使用 Moq,并且能够断言 OnStatus 是这样引发的:

        [Test]
public void TestOnStatusIsRaised()
{
Sim sim = new Sim();

sim.OnStatus += OnStatus;

lock (this)
{
sim.UpdateSimInfo(new Info("a new status"));
Monitor.Wait(this);
}

Assert.IsTrue(_onStatusCalled);
}

private void OnStatus(SimStatus obj)
{
lock (this)
{
_onStatusCalled = true;
Monitor.Pulse(this);
}
}

如您所见,使用 Monitor 类我可以等到事件引发,然后再继续并断言 _onStatusCalled 标志已设置为 true。

当我想断言没有引发事件时,我的困难就来了。我不能使用 Monitor 等待事件不被引发,因为测试将永远等待!我可以为等待添加超时,但这似乎是一个肮脏的 hack。

我尝试了以下方法:

        [Test]
public void TestOnStatusIsNotFired()
{
Sim sim = new Sim();
sim.OnStatus += onStatus => Assert.Fail("OnStatus Was called");

sim.UpdateSimInfo(new Info("the same status"));
}

但它不起作用 - 在修复代码以确保不引发事件之前,测试总是通过。我什至单步执行代码并观察到 ​​Assert.Fail() 抛出异常,但这不会导致测试失败,因为我的事件是在 try/catch block 中引发的,并且捕获到 NUnit 异常。

有什么想法吗?

最佳答案

简而言之,您对多线程代码进行单元测试。您将其拆分为单线程部分并分别测试每个部分。

关于C# 和 Moq - 如何断言未引发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438400/

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