【问题标题】:Net core. Testing timeout dependent method网络核心。测试超时依赖方法
【发布时间】:2020-08-28 20:33:13
【问题描述】:

我有一个方法应该进行 http 调用,并且应该不再等待响应超时。如果在超时时间内没有收到响应,方法应该返回空字符串,BUT 响应必须在以后处理。

    async Task<string> GetResponseOrContinue(int timeout, Action<string> responseHandler)
    {
        var task = Task.Run(async () =>
        {
            var response = await _webClient.UploadStringTaskAsync("url", "");
            responseHandler(response);
            return response;
        });

        var emptyTask = Task.Run(async () =>
        {
            await Task.Delay(timeout);
            return string.Empty;
        });

        return await await Task.WhenAny(task, emptyTask);
    }

为了简单起见,我省略了 try/catch 和其他细节... 这段代码似乎有效,但我坚持尝试测试它。

我编写的测试几乎总是可以正常工作,但有时这个超时的东西会出现问题并且测试失败。

我使用 Moq 框架模拟 UploadStringTaskAsync 调用:

    certWebClient.Setup(x => x.UploadStringTaskAsync(It.IsAny<string>(), It.IsAny<string>()))
        .ReturnsAsync(() =>
        {
            Thread.Sleep(timeout + 10);
            return "this response will be received after timeout";
        });

然后将此 timeout 变量传递给GetResponseOrContinue 方法。看起来很简单,但它并不可靠...... 这里有什么问题,也许有更合适的解决方案来解决此类问题?

【问题讨论】:

标签: c# unit-testing .net-core nunit moq


【解决方案1】:

对此类代码进行单元测试的一种方法是抽象出与线程、任务、计时器、日期时间等有关的所有内容。例如,您可以注入一个特殊的任务工厂,该任务工厂返回可能通过以下方式显式完成的任务你的测试。

这使得代码和测试的编写更加复杂。所以我会考虑任何特定测试的成本/收益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多