是否可以在MSTest的DataTestMethod中使用关键字params?

时间:2019-03-27 02:46:24

标签: c# unit-testing parameters mstest

想要更漂亮的单元测试,我已经使用关键字params将所有参数替换为单个数组。它给了我以下内容。

[DataRow("field1", "field1", "field2", "field2")]
[DataTestMethod]
[ExpectedException(typeof(InvalidJsonDataFieldException))]
public void Parse_ShouldThrow_GivenOrderIsWrong(params string[] fieldReads)
{
    //Doesn't reach this point
    ...
}

因此,string fieldRead1, string fieldRead2, string fieldRead3, string fieldRead4变成了params string[] fieldReads,我认为这更加整洁。一切都可以编译,但是在启动测试时,它将返回以下错误,甚至没有到达第一行。

  

测试方法抛出异常   System.Reflection.TargetParameterCountException,但异常   MyNamespace.MyException是预期的。异常消息:   System.Reflection.TargetParameterCountException:参数化   错误。

因此它肯定在处理它时遇到问题。
你们知道使它起作用的聪明方法吗?
我知道这没什么大不了的,但我还是很好奇。

1 个答案:

答案 0 :(得分:0)

最简单的方法是编写自己的DataRowAttribute:

public class MyDataRowAttribute : DataRowAttribute, ITestDataSource
{
    public MyDataRowAttribute(object data1) : base(data1)
    { }

    public MyDataRowAttribute(object data1, params object[] moreData) : base(data1, moreData)
    { }

    public new IEnumerable<object[]> GetData(MethodInfo methodInfo)
    {
        string[] data = base.Data.Select(x => x.ToString()).ToArray();
        object[] arguments = new object[] { data };

        return new List<object[]> { arguments };
    }
}

然后您可以像这样使用它:

[MyDataRow("field1", "field1", "field2", "field2")]
[DataTestMethod]
public void SampleTest(params string[] fieldReads)
{
    Assert.AreEqual(4, fieldReads.Length);
}