【问题标题】:How to test a method with List<List<T> as input parameter in Xunit如何在 Xunit 中测试使用 List<List<T> 作为输入参数的方法
【发布时间】:2018-02-07 10:00:27
【问题描述】:

我想测试一个以List&lt;List&lt;string&gt;&gt; 为参数的方法。我使用 xunit 作为测试框架。

这是我尝试过的。

public static IEnumerable<IEnumerable<string>> CombinationData
{
    get
    {
        return new List<List<string>>
        {
            new List<string>{ "a", "b", "c" }, 
            new List<string>{ "x", "y", "z" }
        };
    }
}

[Theory]
[MemberData(nameof(CombinationData))]
public void CombinationDataTest(List<List<string>> dataStrings)
{
     ...
}

运行测试时出现以下异常。

System.ArgumentException :
CodeUnitTests.MainCodeTests 上的Property CombinationData 产生了一个不是对象的项目[]
堆栈跟踪:在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()

我如何使它工作?这是正确的方法吗?

【问题讨论】:

  • @RufusL 它是 Visual Studio 中的 xunit 测试运行程序,它给了我例外。 (测试输出窗口)
  • @RufusL 抛出异常的不是我的代码,而是测试框架。执行甚至没有在测试方法中遇到断点。
  • @RufusL 我猜有人可以在测试类中使用上面的代码重现它,并在起始大括号上放置一个断点。我不确定它是否对其他人有用。我可以看到测试框架正在尝试通过迭代 CombinationData 属性来调用测试方法。它可能期望一个 object[] 而不是 List.

标签: c# .net tdd xunit xunit.net


【解决方案1】:

错误信息很清楚。为MemberData 提供的函数应返回IEnumerable&lt;object[]&gt;,其中

  • IEnumerable的每一项都是一个测试用例的参数集合
  • object[] 中的每个 object 都是测试方法预期的参数

您的测试方法期望 List&lt;List&lt;string&gt;&gt; 作为参数,因此您应该返回 List&lt;List&lt;string&gt;&gt; 的实例作为 object[] 的第一项

private static IEnumerable<object[]> CombinationData()
{
    var testcase = new List<List<string>>
    {
        new List<string>{ "a", "b", "c" }, 
        new List<string>{ "x", "y", "z" }
    };  
    yield return new object[] { testcase };
}

【讨论】:

  • 谢谢,那行得通。我错过了你投入子弹的事实之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多