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 秒后评估,如这里所讨论的。
这个问题有更好的解决方案吗?
您对 的调用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)
因为每次轮询时都会评估该属性。