【问题标题】:Moq Raise for an async event listener异步事件侦听器的起订量提升
【发布时间】: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


【解决方案1】:

您也可以将测试转换为异步并等待延迟任务以允许异步事件处理程序执行其功能。

以下示例使用偶数处理程序中的延迟来模拟潜在的长时间运行任务。

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);
    }
}

【讨论】:

  • 谢谢!这应该行得通,当我有时间看看 Moq 中是否有什么东西可以让我加注并等待时,我仍然会进行更多调查,但现在肯定会这样做!
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2016-02-10
  • 2022-09-27
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多