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?
我在这里先向您的帮助表示感谢.
我发现的最好方法是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)