C# 异步事件侦听器的Moq提升

C# 异步事件侦听器的Moq提升,c#,wpf,unit-testing,moq,C#,Wpf,Unit Testing,Moq,在WPF中,我试图使用moq引发一个事件,该事件有一个异步侦听器连接到它: 我的代码: public class Provider { private IService _service public Provider(IService service) { _service = service; _service.OnResultsChanged += ChangeResults; }

在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);
}
[测试]
公开无效测试()
{
//安排
var serviceMock=new Mock();
var systemUnderTest=新提供程序(serviceMock.Object);
//表演
serviceMock.Raise(mock=>mock.OnResultsChanged+=null);
//断言
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);
    }
}
公共接口iSeries设备{
事件事件处理程序OnResultChanged;
}
公共类提供者{
私人电视服务;
公共提供商(iSeries服务){
_服务=服务;
_service.OnResultsChanged+=变更结果;
}
私有异步void ChangeResults(对象发送方、事件参数e){
等待任务。延迟(200);//HasResults=true);
}
公共bool HasResults{get;set;}
}
[测试类]
公共类MyTestClass{
[测试方法]
公共异步任务测试(){
//安排
var serviceMock=new Mock();
var systemUnderTest=新提供程序(serviceMock.Object){
HasResults=false
};
//表演
serviceMock.Raise(mock=>mock.onresultchanged+=null,EventArgs.Empty);

等待任务。延迟(300);//可能是@Nkosi的重复,我遇到的问题是ChageResults中的wait从未被等待过。可能在我的简化示例中,这并不明显,但是当wait中的操作需要更长的时间时,执行就不会被等待,断言也会失败。谢谢!这应该会起作用,我仍然会对它进行更深入的研究恩,我有一些时间来看看Moq中是否有什么东西可以让我提高和等待,但现在这肯定可以了!