如何在Xunit中使用List <list <t>作为输入参数测试方法

时间:2017-08-29 20:15:38

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

我想测试一个以List<List<string>>为参数的方法。我使用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上的属性CombinationData产生了一个不是对象的项目[]
       堆栈跟踪:在System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()

如何让它发挥作用?这是正确的做法吗?

1 个答案:

答案 0 :(得分:2)

错误信息非常清楚。为MemberData提供的功能应返回IEnumerable<object[]>,其中

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

您的测试方法需要List<List<string>>作为参数,因此您应该返回List<List<string>>的实例作为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 };
}