【问题标题】:Unit Test won't run with array as last parameter单元测试不会以数组作为最后一个参数运行
【发布时间】:2023-03-05 11:15:01
【问题描述】:

我有两个单元测试如下:

[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 工作(使用参数按那个顺序)?

正如乔纳森建议的那样,我尝试了以下方法,结果相同:

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

}

【问题讨论】:

  • @JonathonChase 请注意我的编辑。我没有在方法中指定params,所以这是一个不同的问题(另外-您链接的问题的解决方案不能解决我的问题)
  • 不是有params的方法,而是你使用的DataRowAttribute的构造函数。我会尝试[DataRow("input1", new [] {"input2"})] 或可能的[DataRow("input1", new object[] { new object[] { "input2" } })]
  • 很高兴知道。请注意我的编辑
  • 您的第一个建议new [] {"input2"} 会导致构建错误,而第二个建议有效,但看起来很丑陋。有没有更好的办法?

标签: c# visual-studio unit-testing


【解决方案1】:

看看这个帖子: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所指出的,params关键字是在DataRowAttribute constructor中指定的:

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

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

【讨论】:

  • 似乎第二个建议不起作用,所以第一个似乎是我唯一的选择(虽然它很丑 IMO)
  • 我完全同意!此外,我无法完全解释为什么甚至应用隐式 params 关键字,但我尝试创建一个包含您的代码的项目,并且我的 IntelliSense 建议删除数组创建,因为它在使用 params 关键字时是多余的(我也没有),所以这绝对是一件事。
  • 所以看起来我的选择是使用您的第一个建议或切换方法的参数顺序。感谢您的帮助!
  • params 关键字不是隐式的。它在DataRowAttribute 的相关构造函数中:public DataRowAttribute(object data1, params object[] moreData)。在 Visual Studio 的代码中右键单击 DataRow(...) 属性,然后选择“转到定义”。 @derekantrican
  • 啊!这就解释了为什么后一个示例不起作用,因为“input2”不适合 Test1 方法定义的 object[]。我会编辑答案,谢谢!
猜你喜欢
  • 2011-03-04
  • 1970-01-01
  • 2017-11-11
  • 2017-06-10
  • 2019-07-22
  • 2022-11-09
  • 1970-01-01
  • 2021-10-19
  • 2013-12-07
相关资源
最近更新 更多