2

我有两个稍微不同的 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 测试的对象,或者我可以忽略警告吗?

4

0 回答 0