2

TestCaseSource を使用して引数をテストに渡す NUnit パラメーター化単体テストの 2 つのわずかに異なるバリエーション (TestsA と TestsB) があります。いずれの場合も、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