NUnit在包含数组时无法识别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 ); } 

这很好用,在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 ); } 

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

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

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

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

继JetBrains上的这个bug之后 ,看起来这里的解决方案是在不同情况下使用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中正确显示。

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

 [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]或者至少我没有看到它解决了问题。

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

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