gpt4 book ai didi

c# - 使用 NUnit 和 Moq 对事件进行单元测试的更好方法?

转载 作者:太空狗 更新时间:2023-10-29 21:30:10 27 4
gpt4 key购买 nike

我正在使用 NUnit 和 Moq 来测试一个包含一些事件的类,我正试图找到测试事件是否被触发的最佳方法。我想出了这个解决方案,但感觉有点脏,因为我必须为测试创建一个接口(interface)。有什么方法可以用更少的代码做同样的事情,或者不必创建接口(interface)?

还不错,但我觉得有人可能有更好的解决方案。任何想法表示赞赏。谢谢。

[Test]
public void StartedAndStoppedEventsShouldFireWhenStartedAndStopped()
{
var mockStartedEventSubscriber = new Mock<IEventSubscriber>();
var mockStoppedEventSubscriber = new Mock<IEventSubscriber>();

_NetworkMonitor.Started += mockStartedEventSubscriber.Object.Handler;
_NetworkMonitor.Stopped += mockStoppedEventSubscriber.Object.Handler;

_NetworkMonitor.Start();
_NetworkMonitor.Stop();

Func<bool> func = () => { return (eNetworkMonitorStatus.Stopped == _NetworkMonitor.Status); };
Utilities.WaitUntilTrue(func, _NetworkMonitor.Interval * 2, 10);

_NetworkMonitor.Started -= mockStartedEventSubscriber.Object.Handler;
_NetworkMonitor.Stopped -= mockStoppedEventSubscriber.Object.Handler;

mockStartedEventSubscriber.Verify(h => h.Handler(_NetworkMonitor, EventArgs.Empty), Times.Once());
mockStoppedEventSubscriber.Verify(h => h.Handler(_NetworkMonitor, EventArgs.Empty), Times.Once());
}

public interface IEventSubscriber
{
void Handler(object sender, EventArgs e);
}

最佳答案

如果没有模拟,这个测试似乎更容易完成。使测试夹具兼作事件订阅者。

_networkMonitor.Started += this.SetStartedFlag; // a private method which sets a flag in the test fixture.
_networkMonitor.Start();
Assert.That(StartedFlag, Is.True);

关于c# - 使用 NUnit 和 Moq 对事件进行单元测试的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527981/

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