【问题标题】:Assign a friendly name to a data set item provided to an xUnit Theory, to be used for display in the results after the theory name为提供给 xUnit Theory 的数据集项分配一个友好名称,用于在理论名称之后的结果中显示
【发布时间】:2015-03-11 01:03:54
【问题描述】:

我已经开始使用 xUnit 进行单元测试。我有一些测试代码在工作,而一个测试失败了。测试数据通过 MemberDataAttribute 提供给 Theory。 当测试在 Visual Studio 测试资源管理器中执行时,我看到了测试的结果,许多通过,一些失败。

结果看起来像 TestCaseName(expected: 1234abcdef1234abdc....) 我看到 object[] 的哈希码用作调用 Theory 方法的参数列表(或者至少我认为是这样)。

这通常没问题,但我想知道是否有一种优雅的方式可以向 xUnit 提供提示以显示个别案例的一些测试数据集项目标识符?

我认为很明显,根据输入数据浏览测试结果会变得多么容易,这就是为什么我确信框架已经提供了解决方案。

【问题讨论】:

    标签: c# unit-testing xunit


    【解决方案1】:

    为您的参数覆盖 ToString()。

    您在失败案例中实际看到的是传递给理论的 object[] 中所有对象的 ToString() 结果。如果您覆盖这些类的 ToString() 方法(或者专门为这些类创建自定义子类来覆盖 ToString,我偶尔会为已经具有 ToString() 的类做一些事情,旨在提供对其他地方有用的信息),那么它们将准确显示您在失败的测试用例中想要的信息。

    【讨论】:

    • 对于对象 [] 我无法覆盖 ToString() (数组类)。我也不能为构造函数参数类型覆盖它,它们几乎是原始类型,但调用了数组的 ToString。我想出的一种可能的解决方法是使用 Dictionary ,其中键是测试用例描述, [Theory] ​​实际上接受这些键,并手动查找参数。这样,也可以使用类型安全的 N 元组代替 object[]
    • @kódfodrász (澄清一下:它为object[] 测试用例中失败的每个元素调用ToString(),而不是object[] 本身。)object[] 中的参数之一本身是一个数组吗?嗯,我不知道有什么方法可以为数组创建自定义 ToString()。你能改变你的方法来代替IEnumerable<T>吗?然后,您可以将 List<T> 的自定义子类传递给它,它会覆盖 ToString() 以提供有用的信息。
    • 据我所知,理论(如果有多个参数)接受一个对象 [],因为这些是通过反射传递给方法的参数。另一方面,我可以使用我的测试用例数据使 Theory 接受自定义类的单个对象,并创建自定义 ToString(),这样我就不需要我有的基于字典的疯狂想法。我一回到那个项目就会这样做。
    • @kódfodrász 是的,object[] 的内容通过反射或只是强制转换(我尚未调查)传递给 Theory。如果该输入的 Theory 失败,则 object[] 中 每个 元素的 ToString() 将包含在失败消息中。
    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多