【问题标题】:Integration test only works with a Thread.Sleep集成测试仅适用于 Thread.Sleep
【发布时间】:2017-12-13 12:33:52
【问题描述】:

我们目前有一个测试前端 api 调用的集成测试。调用是异步的,因此我们强制它,直到调用准备好将结果与我们期望的结果进行比较。

但是,问题在于代码还包含另一个未等待的异步调用。所以我们嵌套了异步调用。这也是导致测试有时成功有时失败(竞争条件)的原因。

目前,我们已通过在代码中添加 Thread.Sleep (10000) 来解决此问题。但是,这不是一个好的解决方案。

代码如下:

    [TestMethod]
    public void Integration_Test_Example()
    {
        // Arrange
        ...

        // Act
        var request = CreateRequest(@"testfile.xml");
        var task = target.SendMessage(request);

        Thread.Sleep(10000); // dirty fix

        task.Wait();

        // Assert
        ...
    }

有人对我们如何最好地解决这个问题有建议吗?

【问题讨论】:

    标签: c# integration-testing race-condition


    【解决方案1】:

    如果我理解正确 SendMessage 返回任务,那么您应该能够在继续测试之前等待它。

    [TestMethod]
    public async Task Integration_Test_Example()
    {
        var request = CreateRequest(@"testfile.xml");
        var result = await target.SendMessage(request);
    }
    

    【讨论】:

    • 另一个异步调用没有等待,因此这不起作用。
    • 你的SendMessage返回任务,那你为什么不能在SendMessage里面做await呢?你能告诉我们SendMessage代码吗?
    • @LeviSteenbergen 但是这不是说你的实现被破坏了,你很幸运你的测试有时会失败吗?在生产中,你也会参加那场比赛,不是吗?
    【解决方案2】:

    您可以将测试更改为可等待

        [TestMethod]
        public async Task Integration_Test_Example()
        {
            // Arrange
            ...
    
            // Act
            var request = CreateRequest(@"testfile.xml");
            await target.SendMessage(request);
    
            // Assert
            ...
        }
    

    【讨论】:

    • 另一个异步调用没有等待,因此这不起作用
    • @LeviSteenbergen 那么请举一个完整的例子!
    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2020-03-16
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多