【问题标题】:Moq Timeout Exception C#最小起订量超时异常 C#
【发布时间】:2018-04-23 12:04:27
【问题描述】:

我在 C# 中使用 Moq 测试框架,并尝试创建一个单元测试,其中我有一个方法可以通过不可靠的网络调用远程服务器上的服务。

在我尝试进行单元测试的方法中,我有以下代码:

    Task.Factory.StartNew(() => this.remoteClient.SomeMethod(userDetails)).Wait(Timespan.FromSeconds(10));

单元测试的目的是模拟出服务在 10 秒内没有响应的超时时间。

到目前为止,我的单元测试如下,它确实有效,但我觉得它不太正确。

   mockRemoteClientService.Setup(r =>r.SomeMethod(It.IsAny<string>())).Callback(() => Thread.Sleep(11000));

谁能告诉我我所采取的方法是否正确或有其他方法可以做到这一点?

【问题讨论】:

  • 快速观察。你在混合异步和阻塞调用吗?此外,建议避免使用Task.Factory.StartNew,而是使用Task.Run。也许那时您可以使用具有给定时间跨度的取消令牌来完成。
  • 当前状态的问题不清楚,因为它不完整。阅读How to Ask,然后提供minimal reproducible example,可以用来更好地理解您的问题。
  • 你看到我放了c# Framework 4.0了吗? Task.Run 在 Framework 4.0# 中不存在,我无法升级版本。因此,我必须使用 Factory.StartNew 方法
  • 我的立场是正确的。没注意到那个标签。
  • 检查 StartNew 的重载,看看是否有取消令牌。

标签: c# c#-4.0 moq


【解决方案1】:

您可以使用取消令牌来设置实际超时。

当您想模拟服务调用以模拟超时时,您可以使用Throws(或在异步方法的情况下使用ThrowsAsync)抛出TaskCancelledExceptionTimeOutException,如下所示:

mockRemoteClientService.Setup(x => x.SomeMethod(It.IsAny<string>())).Throw(new TaskCancelledException());

然后Assert 你正确处理了响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2017-03-21
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多