【发布时间】:2017-10-09 19:19:10
【问题描述】:
我的测试套件中有一个类似这样的测试:
[Fact]
public void VerifySomeStuff()
{
var stuffCollection = GetSomeStuff();
Assert.Equal(1, stuffCollection.Count());
}
这个测试按我的预期工作,但是当我运行它时 xUnit 会打印一个警告:
警告 xUnit2013:不要使用 Assert.Equal() 检查集合大小。
但是,警告中没有建议替代方案,谷歌搜索将我带到 xUnit 中的源代码,以进行验证此警告已打印的测试。
如果Assert.Equal() 不是验证集合长度的正确方法,那是什么?
澄清一下:我意识到我可以通过例如“欺骗”xUnit 不发出此警告。提取变量或改用Assert.True(stuff.Count() == 1)。后者只是 hacky,而前者感觉就像 xUnit 是例如试图避免IEnumerable<T> 的多次迭代,那么这是错误的方法(因为如果这是一个问题,我会单独获得编译器提示),xUnit 本身不应该多次评估输入(事实上,无论变量提取如何,它都可能获得相同的输入,因为 C# 函数调用是如何工作的)。
所以,我不仅对从输出中删除该警告感兴趣。我的问题的答案还解释了 为什么 警告首先包含在库中,以及 为什么 我应该使用的任何方法都更好。
【问题讨论】:
-
如果您将
stuffCollection.Count()存储在一个单独的变量中并将其传递给断言,它是否会给您同样的错误? -
可能是this one?