33

这是我在使用 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 );
}

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

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

公共无效 MyClass_MyOtherMethod(5,3,System.Int64[]) 失败

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

4

5 回答 5

35

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 中正确显示。

于 2013-07-30T14:24:12.680 回答
12

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

[Test]
[TestCase(new object[] {"foo", "bar", "baz"})]
[TestCase(new object[] {"300", "500", "700"})]    
public void MyClass_SomeOtherMethod(params string[] bunchOfStrings)
{
    // assert something...
}
于 2017-10-05T22:37:50.827 回答
4

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

[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();
   ...
}

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

旁注:[Test]使用时不需要,[TestCase]或者至少我没有看到它解决了问题。

于 2016-05-21T15:19:03.603 回答
1

这适用于带有 NUnit 3.11.0 的 VS 2017

[TestCase(new long[] {5, 6, 942135153})]
public void DummyTest(long[] values)
{
    Assert.That(values != null);
}
于 2019-02-12T22:08:45.817 回答
0

我遇到了一个问题,其中论点的顺序很重要。使用 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) {}

工作得很好

于 2021-03-16T09:15:57.027 回答