c# - 异步事件监听器的 Moq Raise

标签 c# wpf unit-testing moq

在 WPF 中,我正在尝试使用 moq 来引发一个事件,该事件具有与其 Hook 的异步监听器:

我的代码:

 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 等待我的事件监听器的执行?

谢谢!

最佳答案

您也可以将测试转换为异步测试并等待延迟任务以允许异步事件处理程序执行其功能。
以下示例使用偶数处理程序中的延迟来模拟潜在的长时间运行任务。

public interface IService {
    event EventHandler OnResultsChanged;
}

public class Provider {
    private IService _service;
    public Provider(IService service) {
        _service = service;
        _service.OnResultsChanged += ChangeResults;
    }

    private async void ChangeResults(object sender, EventArgs e) {
        await Task.Delay(200); //<-- simulate delay
        await Task.Run(() => HasResults = true);
    }

    public bool HasResults { get; set; }
}
通过将测试转换为异步并等待引发的事件,可以断言断言。
[TestClass]
public class MyTestClass {
    [TestMethod]
    public async Task Test() {
        //Arrange
        var serviceMock = new Mock<IService>();
        var systemUnderTest = new Provider(serviceMock.Object) {
            HasResults = false
        };

        //Act
        serviceMock.Raise(mock => mock.OnResultsChanged += null, EventArgs.Empty);

        await Task.Delay(300); //<--wait

        //Assert
        Assert.IsTrue(systemUnderTest.HasResults);
    }
}

关于c# - 异步事件监听器的 Moq Raise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785263/

相关文章:

c# - 使用最小起订量进行单元测试期间设置属性时出错

c# - 尽管正确设置了绑定(bind)重定向,但无法在运行时加载程序集

C# cosmos 文件 IO 和目录

c# - 为什么 TreeView 控件创建空白节点?

c# - DataTrigger 内的 Storyboard 不会在 RaisePropertyChanged 事件上多次触发

wpf - Windows 8 XAML 多列文本

c# - 哪些文件必须在 SVN 存储库中才能让其他人能够编译?

c# - 在域服务中设置 LocalizationSourceName

c# - 64 位 Windows 上的气球工具提示

单元测试验收测试?