我有两个稍微不同的 NUnit 参数化单元测试变体(TestsA 和 TestsB),它们使用 TestCaseSource 将参数传递给测试。在每种情况下,我都会传递一个实现 IDisposable 接口的类的实例(我System.Windows.Forms.Control
在示例中使用该类):
[TestFixture]
[Category("Tests A")]
public static class TestsA
{
private static Control _CONTROL;
[TearDown]
public static void Teardown()
{
_CONTROL.Dispose();
}
private static class TestCases
{
public static IEnumerable<TestCaseData> TestCase1()
{
_CONTROL = new Control { Tag = 1 };
yield return new TestCaseData(_CONTROL);
}
public static IEnumerable<TestCaseData> TestCase2()
{
_CONTROL = new Control { Tag = 2 };
yield return new TestCaseData(_CONTROL);
}
}
[TestCaseSource(typeof(TestCases), nameof(TestCases.TestCase1))]
public static void Test1(Control control)
{
if (control == null)
throw new ArgumentNullException(nameof(control));
Assert.AreEqual(1, (int)control.Tag);
}
[TestCaseSource(typeof(TestCases), nameof(TestCases.TestCase2))]
public static void Test2(Control control)
{
if (control == null)
throw new ArgumentNullException(nameof(control));
Assert.AreEqual(2, (int)control.Tag);
}
}
[TestFixture]
[Category("Tests B")]
public static class TestsB
{
private static class TestCases
{
public static IEnumerable<TestCaseData> TestCase1()
{
yield return new TestCaseData(new Control { Tag = 1 });
}
public static IEnumerable<TestCaseData> TestCase2()
{
yield return new TestCaseData(new Control { Tag = 2 });
}
}
[TestCaseSource(typeof(TestCases), nameof(TestCases.TestCase1))]
public static void Test1(Control control)
{
if (control == null)
throw new ArgumentNullException(nameof(control));
Assert.AreEqual(1, (int)control.Tag);
control.Dispose();
}
[TestCaseSource(typeof(TestCases), nameof(TestCases.TestCase2))]
public static void Test2(Control control)
{
if (control == null)
throw new ArgumentNullException(nameof(control));
Assert.AreEqual(2, (int)control.Tag);
control.Dispose();
}
}
我正在尝试提出处理 IDisposable 实例的正确方法。TestsA 类中的测试使用 TearDown 方法进行处理。在 TestsB 中,我在 Assert 之后立即处理实例。但无论我怎么做,我最终都会收到 CA2000 警告。TestsA 和 TestsB 的警告描述略有不同:
TestsA:
警告 CA2000 在方法“TestsA.TestCases.TestCase1()”中,对象“new Control()”并未沿所有异常路径进行处理。在对对象“new Control()”的所有引用超出范围之前调用 System.IDisposable.Dispose。
TestsB:
警告 CA2000 在方法“TestsB.TestCases.TestCase1()”中,在对对象“new Control()”的所有引用超出范围之前调用 System.IDisposable.Dispose。
我的问题是:有没有更好的方法来处理通过 TestCaseSource 传递给 NUnit 测试的对象,或者我可以忽略警告吗?