【问题标题】:NUnit cannot recognise a TestCase when it contains an arrayNUnit 在包含数组时无法识别 TestCase
【发布时间】:2013-07-29 08:29:39
【问题描述】:

这是我在使用 NUnit 时遇到的非常简单但令人讨厌的行为:

我有一些这样的测试:

[Test]
[TestCase( 1, 2, "hello" )]
[TestCase( 3, 5, "goodbye" )]
public void MyClass_MyMethod( int a, int b, string c )
{
    Assert.IsTrue( a < b );
}

这很好用,在 ReSharper NUnit 窗格中,我可以看到每个 TestCase 在结果中都有自己的响应。

我有第二个 TestCase,如下所示:

[Test]
[TestCase( 1, 2, new long[] { 100, 200 })]
[TestCase( 5, 3, new long[] { 300, 500 })]
public void MyClass_MyOtherMethod( long a, long b, long[] bunchOfNumbers )
{
   Assert.IsTrue( a < b );
}

当我运行它时,我会看到:

一个或多个子测试有错误异常没有堆栈跟踪

public void MyClass_MyOtherMethod(5,3,System.Int64[]) 失败

不同之处在于,在我的其他测试中,它会将每个 TestCase 作为测试列表上的一个单独复选框绘制出来,而这个没有显示出来,并且我没有详细信息,直到我在调试器中运行它以了解出现了什么问题和在哪里。我有点担心这个测试在构建机器上的表现。有谁知道发生了什么以及为什么?

【问题讨论】:

  • 也可能是不支持的 ReSharper 测试运行器。
  • 好点,将检查 NUnit 控制台。
  • 您使用哪些版本的 NUnit 和 Resharper?我记得在其中一个的较晚版本中修复了一些问题。
  • 对了,你有没有试过传递这个标有params修饰符的数组?
  • NUnit 2.6.2 与 ReSharper 7.1 - 可能我需要向 Jetbrains 提出这个问题。 params 修饰符有什么作用?

标签: c# unit-testing nunit testcase


【解决方案1】:

this bug at JetBrains 开始,这里的解决方案似乎是在您的不同情况下使用TestName 属性:

[Test]
[TestCase( 1, 2, new long[] { 100, 200 }, TestName="Test 1" )]
[TestCase( 5, 3, new long[] { 300, 500 }, TestName="Test 2" )]
public void MyClass_MyOtherMethod( long a, long b, long[] bunchOfNumbers )
{
   Assert.IsTrue( a < b );
}

如果我的一项测试失败,现在 ReSharper 中的所有内容都会正确显示。

【讨论】:

  • 在当前版本的 NUnit 和 ReSharper 中似乎不再需要这种解决方法。
  • 如果你的第一个参数是数组,它仍然不喜欢它。
  • 但如果参数列表中有多个数组,它会起作用。
  • @JacobBrewer:那是因为TestCase 的签名期望params object[] 作为它的第一个参数——所以传入一个数组将导致nUnit 寻找一个参数与类型匹配的测试方法签名,并且数组的长度。
【解决方案2】:

对于包含字符串的数组,使用具有TestCase 属性的object 数组以及params

[Test]
[TestCase(new object[] {"foo", "bar", "baz"})]
[TestCase(new object[] {"300", "500", "700"})]    
public void MyClass_SomeOtherMethod(params string[] bunchOfStrings)
{
    // assert something...
}

【讨论】:

  • 这对我来说不太适用,将 MSTest 与 NUnit 适配器一起使用。错误消息是Too many arguments provided, provide at most 1 arguments.,这一定是在测试运行器级别,因为我什至无法进入测试。在测试方法签名中添加 params 关键字就可以了。
  • 谢谢@user1007074。用你的修复更新了答案。
  • 对于 Rider 2020.3.2,这是使用单个数组参数进行单元测试的方式。
【解决方案3】:

另一种方法是对数组使用字符串:

[TestCase( 1, 2, "100, 200")]
[TestCase( 5, 3, "300, 500")]
public void MyClass_MyOtherMethod(long a, long b, string bunchOfNumbersString)
{
    var bunchOfNumbers= bunchOfNumbersString.Split(',')
                                            .Select(long.Parse)
                                            .ToArray();
   ...
}

这种方法的好处是它可以在测试运行器中很好地呈现。

旁注:使用[TestCase] 时不需要[Test],或者至少我认为它不能解决问题。

【讨论】:

    【解决方案4】:

    这适用于带有 NUnit 3.11.0 的 VS 2017

    [TestCase(new long[] {5, 6, 942135153})]
    public void DummyTest(long[] values)
    {
        Assert.That(values != null);
    }
    

    【讨论】:

      【解决方案5】:

      我遇到了一个问题,其中参数的顺序很重要。使用 Rider 2020.1.4

      [TestCase(new string[] { "ABC", "DEF" }, false)]
      public void SomeTestWithParams(string[] stringArr, bool someBool) {}
      

      给了我一个错误,但是

      [TestCase(false, new string[] { "ABC", "DEF" })]
      public void SomeTestWithParams(bool someBool, string[] stringArr) {}
      

      工作得很好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多