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

我在我的测试套件中有一个类似这样的测试:

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


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

这个测试正如我所期望的那样工作,但是当我运行它时,xUnit 会打印一个警告:

警告 xUnit2013: 不要使用 Assert.equals ()检查集合大小。

但是,在这个警告中没有其他建议,并且 google 搜索会将我带到 xUnit 中的源代码,以进行验证打印这个警告的测试。

如果 Assert.Equal()不是验证集合长度的正确方法,那么什么才是?


澄清一下: 我意识到我可以通过提取一个变量或者使用 Assert.True(stuff.Count() == 1)来“欺骗”xUnit 不发出这个警告。后者就显得有些古怪了,前者让人觉得如果 xUnit 试图避免 IEnumerable<T>的多次迭代,那么这就是错误的做法(因为如果这是一个问题,我将单独得到编译器提示) ,而且 xUnit 本身不应该不止一次地求值输入(事实上,由于 C # 函数调用的工作方式,不管变量提取如何,它可能都会得到相同的输入)。

所以,我不仅仅对从输出中删除该警告感兴趣。对我的问题的一个回答也解释了 为什么,首先在库中包含警告,而 为什么无论我应该使用什么方法都是更好的。

52757 次浏览

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

xunit

在您的情况下,它希望您使用 Assert.Single,因为您正好期待一个项目。如果您断言一个任意的数字,比如412,那么它不会对使用 Count给出警告。它只会建议使用 Single,如果你期望一个项目,或 Empty,如果你期望没有项目。

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

enter image description here

之后,我使用 Count ()函数收集,它修复了我的问题。

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

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

铸造它阻止了错误的出现。

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

对于列表中的单个元素,最好使用以下代码: Assert.Single(resultList);

如果您有多个项,则不能使用 Assert.Single。

我们的期望似乎是您应该使用 Assert.Collection:

var stuffCollection = GetSomeStuff();


Assert.Collection(stuffCollection,
item => true, // this lambda verifies the first item
item => true, // second item
);

上面的断言验证集合中正好有两个项。如果需要,可以为每个项目提供更严格的 lambdas (例如 item => item.property1 == 7)。

就个人而言,我不是一个粉丝; 这似乎是一个非常冗长的方式来说明您希望这个集合有多长。

该规则仅在测试集合中的0或1个项时适用。

Assert.Equal(0, result.Length) // rule warning, use .Empty
Assert.Equal(1, result.Length) // rule warning, use .Single
Assert.Equal(2, result.Length) // ok

满足规则:

Assert.Empty(result); // for 0 items
Assert.Single(result); // for 1 item
Assert.NotEmpty(result); // for 1 or more items

在使用 Assert.NotEmpty 时,我们也可以精确计数

Assert.Equal(2, result.Length) // Does not violate rule xUnit2013

Https://xunit.net/xunit.analyzers/rules/xunit2013

如果你无视警告,我不会告诉任何人。就我个人而言,我认为它的麻烦大于它的价值。如果你有一个。编辑配置:

[*.cs]
dotnet_diagnostic.xUnit2013.severity = none # warning xUnit2013: Do not use Assert.Equal() to check for collection size.

要用一个元素检查集合的长度,可以使用:

断言。单(你的收集)