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

标签 c# xunit xunit.net

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

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

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

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

warning xUnit2013: Do not use Assert.Equal() to check for collection size.

但是,警告中没有建议替代方案,谷歌搜索将我带到 xUnit 中的源代码以进行验证打印此警告的测试。

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


澄清一下:我意识到我可以通过例如“欺骗”xUnit 不发出此警告提取变量或使用 Assert.True(stuff.Count() == 1)反而。后者只是 hacky,而前者感觉就像 xUnit 一样。试图避免 IEnumerable<T> 的多次迭代,那么这是错误的方法(因为如果这是一个问题,我会单独获得编译器提示),并且 xUnit 本身永远不必多次评估输入(事实上,它可能会得到相同的输入,无论变量提取,因为 C# 函数调用的工作方式)。

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

最佳答案

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

xunit

在您的情况下,它希望您使用 Assert.Single,因为您只需要一个项目。如果您声明一个任意数字,例如 412,那么它不会向您发出有关使用 Count 的警告。如果您需要一件元素,它只会建议您使用 Single,如果您不需要任何元素,它只会建议您使用 Empty

关于c# - 在 xUnit 中验证集合大小的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46653557/

相关文章:

c# - XUnit - 仅针对特定异常类型的 Assert.DoesNotThrow

c# - 如何防止 Visual Studio 缩进换行符 (C#)?

c# - 在特定位置显示 UI 元素上方的浮出控件

c# - 对缓冲的 Observable 进行排序

testing - TFS 2013 将测试用例关联自动化链接到 xUnit 测试

c# - 网络核心: Find Application Assembly Location from Integration Test

c# - 有没有办法使用 resharper 属性指定后置条件?

.net-core - OpenCover 在 pdbs 存在时报告丢失的 pdbs (XUnit/.NET Core)

c# - xUnit - 在测试中提取和实现接口(interface)

c# - 如何在 Xunit 中测试使用 List<List<T> 作为输入参数的方法