我正在使用我的System.IO.FileSystemWatcher
一项服务。我想测试当被监视的文件被更改时,我会收到通知。
我正在考虑让后台线程更改文件。在测试中,我会加入那个线程。然后我可以断言调用了正确的事件。如果事件被调用,我可以订阅一个回调来捕获。
我没有做过任何涉及线程的测试,所以我不确定这是否是处理它的最佳方式,或者 Moq 或 MSpec 中是否有一些内置方式可以帮助测试。
我正在使用我的System.IO.FileSystemWatcher
一项服务。我想测试当被监视的文件被更改时,我会收到通知。
我正在考虑让后台线程更改文件。在测试中,我会加入那个线程。然后我可以断言调用了正确的事件。如果事件被调用,我可以订阅一个回调来捕获。
我没有做过任何涉及线程的测试,所以我不确定这是否是处理它的最佳方式,或者 Moq 或 MSpec 中是否有一些内置方式可以帮助测试。
Moq 或 MSpec 没有任何专门内置的东西可以帮助您做到这一点,除了一些有趣的语法或功能可以帮助您组织测试。我认为你在正确的道路上。
我很好奇您的服务如何公开文件更改通知。它是否公开暴露它们以进行测试?还是FileSystemWatcher
完全隐藏在服务内部?如果该服务不简单地传递事件通知,您应该提取您的文件监控,以便可以轻松地对其进行测试。
您可以使用 .NET 事件或回调或其他方式来做到这一点。不管你怎么做,我都会写这样的测试......
[Subject("File monitoring")]
public class When_a_monitored_file_is_changed
{
Establish context = () =>
{
// depending on your service file monitor design, you would
// attach to your notification
_monitor.FileChanged += () => _changed.Set();
// or pass your callback in
_monitor = new ServiceMonitor(() => _changed.Set());
}
Because of = () => // modify the monitored file;
// Wait a reasonable amount of time for the notification to fire, but not too long that your test is a burden
It should_raise_the_file_changed_event = () => _changed.WaitOne(TimeSpan.FromMilliseconds(100)).ShouldBeTrue();
private static readonly ManualResetEvent _changed = new ManualResetEvent();
}