延迟后评估 NUnit 断言

Tee*_*Tee 1 c# nunit assert assertion

我正在尝试使用 NUnit 为一种方法编写单元测试,该方法可能需要 1 到 3 秒才能完成。为了验证测试,我需要做的就是检查 aList<string> entries是否在 1 到 3 秒的跨度内增加。

我目前的解决方案是使用Thread.Sleep()

1. int currentEntries = entries.count;
2. Call methodA()
3. Thread.Sleep(3000);
4. int updatedEntries = entries.count;
5. Assert.That(updatedEntries, Is.EqualTo(currentEntries+1));
Run Code Online (Sandbox Code Playgroud)

此解决方案始终至少需要 3 秒,即使 methodA() 完成得更快。

我曾尝试使用 NUnits 延迟约束:

Assert.That(entries.Count, Is.EqualTo(currentEntries+1).After(3).Seconds.PollEvery(250).MilliSeconds);
Run Code Online (Sandbox Code Playgroud)

这本来是理想的,因为它支持轮询。但是After约束仍然会立即评估,而不是在 3 秒后评估,如这里所讨论的。

这个问题有更好的解决方案吗?

Cha*_*lie 5

您对 的调用Assert.That具有实际参数,该参数在调用方法之前立即进行评估。取值entries.Count并将结果整数值复制为方法参数。在该方法中,我们正在处理一个常量。

当每 250 毫秒重新评估约束时,每次都会针对相同的复制常量完成,当然永远不会改变。

当您使用延迟约束时,无论有没有轮询,实际参数必须采用委托、lambda 或对字段的引用的形式。以下简单的修改应该使它工作。

Assert.That (() => entries.Count, Is.EqualTo(currentEntries+1).After(3).Seconds.PollEvery(250).MilliSeconds);
Run Code Online (Sandbox Code Playgroud)

或者,这也应该有效

Assert.That (entries, Has.Count.EqualTo(currentEntries+1).After(3).Seconds.PollEvery(250).Milliseconds);
Run Code Online (Sandbox Code Playgroud)

因为每次轮询时都会评估该属性。