【发布时间】:2018-05-26 21:14:09
【问题描述】:
在 WPF 中,我正在尝试使用 moq 来引发一个挂有异步侦听器的事件:
我的代码:
public class Provider
{
private IService _service
public Provider(IService service)
{
_service = service;
_service.OnResultsChanged += ChangeResults;
}
private async void ChangeResults(List resultsAdded)
{
await Task.Run(() => HasResults = true;)
}
}
为简化起见,我已将 hasresults 设置为 true,但我实际上是在将项目添加到列表中,并且由于此操作可能需要一段时间,因此我正在一项新任务中执行此操作。在我的测试中,以下失败,因为它不等待 DoSomething 执行:
我的测试:
[Test]
public void Test()
{
//Arrange
var serviceMock = new Mock<IService>();
var systemUnderTest = new Provider(serviceMock .Object);
//Act
serviceMock.Raise(mock => mock.OnResultsChanged += null);
//Assert
Assert.IsTrue(systemUnderTest.HasResults);
}
是否可以告诉 mock.raise 等待我的事件监听器的执行?
谢谢!
【问题讨论】:
-
@Nkosi,我得到的问题是 ChageResults 中的 await 永远不会被等待。可能在我的简化示例中这并不明显,但是当等待内部的操作需要更长的时间时,不会等待执行并且断言失败。
标签: c# wpf unit-testing moq