【问题标题】:Passing single value to params argument in NUnit TestCase将单个值传递给 NUnit TestCase 中的 params 参数
【发布时间】:2012-03-03 21:33:11
【问题描述】:

我有以下测试:

[ExpectedException(typeof(ParametersParseException))]
[TestCase("param1")]
[TestCase("param1", "param2")]
[TestCase("param1", "param2", "param3", "optParam4", "optParam5", "some extra parameter")]
public void Parse_InvalidParametersNumber_ThrowsException(params string[] args)
{
    new ParametersParser(args).Parse();
}

第一个 TestCase(显然)失败并出现以下错误:

System.ArgumentException : Object of type 'System.String' 
cannot be converted to type 'System.String[]'.

我试图用这个替换 TestCase 定义:

[TestCase(new[] { param1 })]

但现在我得到以下编译错误:

错误 CS0182:属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

我现在的解决方案是将“一个参数”的情况转移到不同的测试方法。

不过,有没有办法让这个测试以与其他测试相同的方式运行?

【问题讨论】:

    标签: c# unit-testing nunit parameter-passing


    【解决方案1】:

    一种方法是使用TestCaseSource,并有一个返回每个参数集的方法,而不是使用TestCase。

    【讨论】:

      【解决方案2】:

      基于this answer对问题'NUnit cannot recognize a TestCase when it contains an array'的响应,编译错误源于bug,可以使用命名测试用例的语法来克服,如下所示:

      [ExpectedException(typeof(ParametersParseException))]
      [TestCase(new[] { "param1"}, TestName="SingleParam")]
      [TestCase(new[] { "param1", "param2"}, TestName="TwoParams")]
      [TestCase(new[] { "param1", "param2", "param3", "optParam4", "optParam5"}, "some extra parameter", TestName="SeveralParams")]
      public void Parse_InvalidParametersNumber_ThrowsException(params string[] args)
      {
          new ParametersParser(args).Parse();
      }
      

      【讨论】:

      • 您链接到一个 resharper 问题,而问题似乎出在 nunit 中……无论如何,似乎 resharper 解决了问题
      • 使用 new[] { ... } 执行此操作,其中数组是字符串,会出现上面 OP 引用的错误 CS0182。整数类型似乎工作正常。
      【解决方案3】:

      虽然我不推荐这种方式,

      但这里是另一种将单个参数传递给params 数组的方法,方法是在params 参数之前使用一个虚拟对象参数。

      请看下面的例子:

      [ExpectedException(typeof(ParametersParseException))]
      [TestCase(null, "param1")]
      [TestCase(null, "param1", "param2")]
      [TestCase(null, "param1", "param2", "param3", "optParam4", "optParam5", "some extra parameter")]
      public void Parse_InvalidParametersNumber_ThrowsException(object _, params string[] args)
      {
          new ParametersParser(args).Parse();
      }
      

      PS 更好的方法是使用TestCaseSource 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        相关资源
        最近更新 更多