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

标签 c# unit-testing events nunit moq

我正在使用 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/

相关文章:

c# - 使用 Rx 同步异步事件

c# - 如何在 Asp.Net Core 中注册同一接口(interface)的多个实现?

c# - 系统.InvalidCastException : Failed to convert parameter value from a XElement to a String

unit-testing - 使用测试/资源文件来比较单元测试输出=代码味道?

javascript - 捕获(不同)打印/取消打印按钮事件(单击)

javascript - Firefox 中的 WebRTC 事件

c# - 如何使用 ViewBag 存储字符串数组

java - 在@SpringBootTest中测试@Async注释的方法

python - 来自另一个文件的 pytest fixture

c++ - 我如何在 linux 中使用 ctrl-c 使 wxTextCtrl 句柄