【问题标题】:NUnit Throws.Nothing.After( , ) test fails first timeNUnit Throws.Nothing.After( , ) 测试第一次失败
【发布时间】:2017-01-22 20:56:35
【问题描述】:

我有一个 NUnit 测试,有时会在开始时引发异常,因此我想使用 .After 约束将其包装在一个带有延迟和间隔的超时中。

这不是确切的代码,但它是我正在谈论并试图实现的示例。

[Test]
public void ThrowsNothingAfterTest()
{
    var i = 0;
    Assert.That(() =>
    {
        if (i == 1)
        {
            return true;
        }

        i++;
        throw new NotImplementedException();
    }, Throws.Nothing.After(1000, 100));
}

我假设上述测试会第一次失败,然后通过时间,但它只运行一次并失败。

【问题讨论】:

  • 您究竟想在这里实现什么?你的测试没有多大意义。
  • 我有一个在[SetUpFixture] 中启动的服务,它需要一段时间才能启动。所以我想调用该服务正在公开的 Web 服务,然后测试它的值。

标签: unit-testing nunit


【解决方案1】:

After 可能在功能上与Throws.Nothing 不一致。我们应该检查一下,可能想办法让它在语法上不可能。

您使用的语法是:每 100 毫秒尝试一次此调用,直到它不抛出,最多 1000 毫秒(10 次)。这对您的示例无害,但在许多情况下是不可取的。这就是为什么我倾向于让它不可编译而不是让它工作。 :-(

如果您可以编写代码在服务初始化时返回 true,那么您可以简单地使用

Assert.That(() => IsServiceUpAndRunning(),
            After(1).Seconds.PollEvery(10).Milliseconds);

如果抛出异常,只需在方法中捕获并返回false即可。

【讨论】:

  • 如果它像Is 那样工作会很好,但这是一个相当可接受的解决方法。谢谢
  • 哇,这个答案终于让我明白 After(100).PollEvery(2) 不会等待 100 毫秒,然后永远每 2 毫秒轮询一次。这感觉就像一个流畅的设计错误。它的编程方式应该写成 .PollEvery(2).Timeout(100)
猜你喜欢
  • 2012-08-14
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多