在测试清理中处理对象时,静态分析在测试 class 中处理警告

Static analysis dispose warning in test class when object is disposed in test cleanup

我有很多这样的测试 class。

[TestClass]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
public class TestClass
{
    private IDisposable _disposable;

    [TestInitialize]
    public void TestInitialize()
    {
        _disposable = //new disposable object...;
    }

    [TestCleanup]
    public void TestCleanup()
    {
        _disposable.Dispose();
    }

    [TestMethod]
    public void Test1()
    {
        //Uses _disposable
    }

    [TestMethod]
    public void Test2()
    {
        //Uses _disposable
    }

    [TestMethod]
    public void TestN()
    {
        //Uses _disposable
    }
}

使用 FxCop 进行静态分析会导致以下警告,因为我没有在我的测试中实施处置模式 class。

"CA1001: Types that own disposable fields should be disposable"

现在我只是抑制源中的消息,但我觉得必须有比使用 SuppressMessageAttribute 使我的所有测试混乱的更好的方法。这似乎是测试中的一种常见模式——为测试创建对象,然后在测试后将其处置。我不能只在测试 class 上实现 IDisposable,因为只为所有测试方法创建了一个测试对象。我想在每个测试方法之间处理这个对象。

我知道我可以在每个测试中创建对象并在测试中处理它,但我宁愿继续使用 SuppressMessageAttribute 而不是将相同的代码复制并粘贴到每个测试方法中。这似乎是两害相权取其轻。 是否有更好的方法在每次测试前创建一次性对象并在每次测试后处置它而不导致警告 CA1001?

提前感谢您的帮助。

错误要求在您的 TestClass 上实现 IDisposable 接口。 Here 很好地讨论了为什么有必要)。它的实现应该是这样的:

public class TestClass :IDisposable
{

    public void Dispose()
    {
        if (!IsDisposed) //Check if _disposable is not disposed
            _disposable.Dispose();
    }

参见:Implement IDisposable correctly

我发现的最佳方法是在测试 class 中实现 IDisposable 并使用 TestCleanup 属性标记 Dispose 方法。

[TestClass]
public class TestClass : IDisposable
{
    private IDisposable _disposable;

    [TestInitialize]
    public void TestInitialize()
    {
        _disposable = //new disposable object...;
    }

    [TestCleanup]
    public void Dispose()
    {
        _disposable.Dispose();
    }