静态分析在测试清理中放置对象时在测试类中配置警告

r2_*_*118 5 c# unit-testing dispose fxcop

我有很多像这样的测试类.

[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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用FxCop进行静态分析会导致以下警告,因为我没有在我的测试类上实现dispose模式.

"CA1001:拥有一次性田地的类型应该是一次性的"

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

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

我在这里先向您的帮助表示感谢.

Eri*_*rik 6

我发现的最好方法是IDisposable在测试类中实现并Dispose使用TestCleanup属性标记方法.

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

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

    [TestCleanup]
    public void Dispose()
    {
        _disposable.Dispose();
    }
Run Code Online (Sandbox Code Playgroud)

  • 它不需要将其标记为`TestCleanup`,无论如何都要对象进行每个测试. (2认同)