NUnit在包含数组时无法识别TestCase

gle*_*ron 28 c# nunit unit-testing testcase

这是非常简单但令人烦恼的行为,我遇到了NUnit:

我有一些像这样的测试:

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

这工作正常,在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 );
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我看到了这个:

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

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

与我的其他测试不同的是,它将每个TestCase抽取为测试列表上的一个单独的复选框,而这一个没有显示,我没有详细信息,直到我在调试器中运行它出现了什么问题以及在哪里.我有点担心这个测试在构建机器上的表现.有谁知道发生了什么,为什么?

gle*_*ron 32

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 );
}
Run Code Online (Sandbox Code Playgroud)

如果我的一个测试失败,现在一切都在ReSharper中正确显示.

  • 如果您的第一个参数是数组,它仍然不喜欢它. (4认同)
  • 它看起来与当前版本的NUnit和ReSharper一样,不再需要这种解决方法. (3认同)
  • @JacobBrewer:那是因为`TestCase`的签名期望`params object []`作为它的第一个参数 - 所以传入一个数组将导致nUnit寻找一个测试方法签名,其中参数匹配数组的类型和长度. (3认同)

Ray*_*ega 10

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

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

  • 这对我来说不太适用,将 MSTest 与 NUnit 适配器一起使用。错误消息是“提供的参数太多,最多提供 1 个参数。”这一定是在测试运行器级别,因为我什至无法进入测试。在测试方法签名中添加 `params` 关键字可以解决问题。 (4认同)