单元测试不会将数组作为最后一个参数运行

时间:2019-01-21 19:17:27

标签: c# visual-studio unit-testing

我有两个单元测试,如下所示:

[DataTestMethod]
[DataRow("input1", new object[] { "input2" })]
public void Test1(string input1, object[] input2)
{

}

[DataTestMethod]
[DataRow(new object[] { "input1" }, "input2")]
public void Test2(object[] input1, string input2)
{

}

第一个单元测试Test1由于System.ArgumentException: Object of type 'System.String' cannot be converted to type 'System.Object[]'.而无法运行。 Test2(在切换参数的情况下)运行良好。我认为这可能是因为Test1正在将input2感知为一种params由于我没有指定params,所以我不确定情况如何。it seems that DataRowAttribute specifies params)我可以通过什么方式获得Test1工作(按顺序排列参数)?

按照乔纳森(Jonathan)的建议,我尝试了以下相同的结果:

[DataTestMethod]
[DataRow("input1", (object)new object[] { (object)"input2" })]
public void Test1(string input1, object[] input2)
{

}

1 个答案:

答案 0 :(得分:2)

看看这篇文章:The mysterious ways of the params keyword in C#

  

请注意,语言规范相对于扩展形式更喜欢普通形式:仅当不使用普通形式时,才考虑扩展形式。

如果您想坚持使用object类型,似乎您基本上有两个选择:

[DataTestMethod]
[DataRow("input1", new object[] { new object[]{ "input2" } })]
public void Test1(string input1, object[] input2)
{

}

(将不起作用,请在下面阅读编辑内容)

[DataTestMethod]
[DataRow("input1", "input2")]
public void Test1(string input1, object[] input2)
{

}

编辑:如derekantrican所指出,在DataRowAttribute constructor中指定了params关键字:

public DataRowAttribute (object data1, params object[] moreData);

这意味着要使用问题中指定的Test1构造函数,object[]必须在另一个object[]内部,如我的第一个示例一样,而第二个示例将不起作用,因为stringobject[]的签名不匹配。