Visual Studio 单元测试无法以数组作为最后一个参数运行

7ajki6be  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(148)

我有两个单元测试如下:

  1. [DataTestMethod]
  2. [DataRow("input1", new object[] { "input2" })]
  3. public void Test1(string input1, object[] input2)
  4. {
  5. }
  6. [DataTestMethod]
  7. [DataRow(new object[] { "input1" }, "input2")]
  8. public void Test2(object[] input1, string input2)
  9. {
  10. }

第一个单元测试Test1不会运行,因为System.ArgumentException: Object of type 'System.String' cannot be converted to type 'System.Object[]'.Test2(切换参数)运行得很好。我认为这可能是因为Test1input2感知为一种params。由于我没有指定params,我不确定这是怎么回事。(似乎DataRowAttribute指定了params)我可以让Test1工作的方法是什么(按照这个顺序的参数)?
正如乔纳森所建议的,我尝试了以下方法,得到了相同的结果:

  1. [DataTestMethod]
  2. [DataRow("input1", (object)new object[] { (object)"input2" })]
  3. public void Test1(string input1, object[] input2)
  4. {
  5. }
uhry853o

uhry853o1#

看看这篇文章:The mysterious ways of the params keyword in C#
请注意,语言规范更喜欢范式而不是扩展形式:它只在范式不适用的情况下考虑展开形式。
如果你想坚持使用object类型,你基本上有两个选择:

  1. [DataTestMethod]
  2. [DataRow("input1", new object[] { new object[]{ "input2" } })]
  3. public void Test1(string input1, object[] input2)
  4. {
  5. }

(不起作用,阅读下面的编辑)

  1. [DataTestMethod]
  2. [DataRow("input1", "input2")]
  3. public void Test1(string input1, object[] input2)
  4. {
  5. }

Edit:正如derekantrican所指出的,params关键字在DataRowAttribute构造函数中指定:

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

这意味着要使用问题中指定的Test1构造函数,object[]必须位于另一个object[]中,就像我的第一个例子一样,而第二个例子将不起作用,因为string将不匹配object[]的签名。

展开查看全部

相关问题