在xUnit中验证集合大小的惯用方式是什么?


112

我的测试套件中有一个测试是这样的:

[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)。后者只是骇人听闻的,而前者的感觉就像是如果xUnit例如试图避免的多次迭代IEnumerable<T>,那么这是错误的方法(因为如果遇到问题,我将分别获得编译器的提示)和xUnit本身永远不必对输入进行多次评估(实际上,由于C#函数调用的工作原理,无论变量提取如何,它都将获得相同的输入)。

因此,我不仅对从输出中删除该警告感兴趣。我的问题的答案还解释了为什么该警告首先包含在库中,以及为什么我应该改用任何方法更好。


如果您存储stuffCollection.Count()在单独的变量中并将其传递给断言,是否会给您同样的错误?
hellyale

也许这一个
Uwe Keim

Answers:


112

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

单位

在您的情况下,它希望您使用,Assert.Single因为您只需要一件商品。如果您声明一个任意数字(例如412),则不会向您发出有关使用的警告Count。仅Single在需要一项或Empty没有一项时才建议使用。


6
谢谢,这很有意义。FWIW,在VS Code中构建时,我看到了这一点,但没有显示快速操作,因此实际上在警告消息中包含修复建议会更有帮助。
Tomas Aschan

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

5
我不喜欢这种行为;有时1计数只是偶然的,并且强制执行对.Single()的调用似乎不太具有表达能力。测试可能会更改,以期望获得不同的计数,而不得不进行更改以调用完全不同的方法而不是仅更改数字似乎很烦人。
vargonian '19

2
Single对于单个Item很酷,我有3个Item,并且我不想编写完整的Assert.Collection,xUnit是否具有Assert.Triple吗?哈哈
Pawel Cioch

1
@PawelCioch根据xunit.net/xunit.analyzers/rules/xUnit2013.html他们EmptySingleNotEmpty-如果你期望一个动态值xUnit2013不应该触发。
mbx

2

我发现这给了我同样的错误:

Assert.Equal(2, vm.Errors.Count());

并对其进行投射,阻止了错误的出现。

Assert.Equal(2, (int)vm.Errors.Count());

2
我敢肯定,这是不是ideomatic方式。
mbx


-1

在xUnit中使用Count属性时,我遇到了同样的问题。

在此处输入图片说明

之后,我对集合使用Count()函数,它解决了我的问题。


解决了该问题,但是您仍然没有像应该那样使用XUnit!
丹尼尔·艾森瑞希

8
@DanielEisenreich如果数字大于1,则断言特定数字的正确方法是什么?
SomeGuyOnAComputer

@SomeGuyOnAComputer和其他4个投票。忘了我说的话,我太厚脸皮了。如果更大,您别无选择。
丹尼尔·艾森瑞希
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.