2017-10-09 143 views
27

我在我的测试套件的测试,是这样的:在xUnit中验证集合大小的惯用方法是什么?

[Fact] 
public void VerifySomeStuff() 
{ 
    var stuffCollection = GetSomeStuff(); 

    Assert.Equal(1, stuffCollection.Count()); 
} 

这个测试工作如我所料,但是当我运行它的xUnit打印警告:

警告xUnit2013:做不要使用Assert.Equal()来检查集合的大小。

但是,在警告中没有提供替代方法,并且Google搜索将我带到xUnit中的源代码中进行测试,验证是否打印此警告。如果Assert.Equal()不是验证集合长度的正确方法,那么是什么?


澄清:我意识到我可以“欺骗”xUnit,使其不会发出此警告。取出一个变量或使用Assert.True(stuff.Count() == 1)代替。后者只是黑客,而前者感觉就像xUnit是例如试图避免一个IEnumerable<T>的多次迭代,那么这是一个错误的路要走(因为如果它是一个问题,我会分别得到关于它的编译器提示),并且xUnit本身不应该多次评估输入(在事实上它可能会得到相同的输入,无论变量提取如何,因为C#函数调用的工作方式)。

所以,我不只是有兴趣从我的输出中删除该警告。我的问题的答案也解释了为什么那个警告是包含在库中的第一位,而为什么我应该使用什么方法反而更好。

+0

如果将'stuffCollection.Count()'存储在一个单独的变量中,并将它传递给断言,是否会给出相同的错误? – hellyale

+0

也许[this one](https://stackoverflow.com/a/30815958/107625)? –

回答

29

Xunit为其大多数警告提供了快速修复,因此您应该能够看到它认为的“正确”。

xunit

在你的情况,它要你使用Assert.Single因为你期望只有一个项目。如果你断言一个任意数字,如412,那么它不会给你一个关于使用Count的警告。如果您期待一件物品,它只会建议使用Single;如果您不期望物品,则只会建议使用Empty

+3

谢谢,这是有道理的。 FWIW,当我在VS Code中建立这个快速行动没有出现时,我看到了这一点,所以在警告消息中实际包括修复建议会更有帮助。 –

+1

@TomasLycken - 啊。是的,这里有一个问题:https://github.com/xunit/xunit/issues/1423 – vcsjones

相关问题