У меня есть много классов тестов, подобных этому.Статический анализ выдает предупреждение в классе испытаний, когда объект находится в процессе тестирования.
[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 в следующем предупреждении, потому что я не реализую Dispose рисунка на моем тестовом классе.
«CA1001: Виды, которые владеют одноразовые поля должны быть одноразовыми»
Прямо сейчас я просто подавить сообщение в источнике, но я чувствую, что должен быть лучший способ, чем загромождать все мои тесты с SuppressMessageAttribute. Похоже, что это будет распространенный шаблон при тестировании - создайте объект для теста, а затем удалите его после теста. Я не могу просто реализовать IDisposable в тестовом классе, потому что для всех методов тестирования создается только один тестовый объект. Я хочу уничтожить этот объект между каждым методом тестирования.
Я знаю, что я мог бы создать объект в каждом тесте и утилизировать его в тесте, но я предпочел бы продолжать использовать SuppressMessageAttribute для копирования и вставки одного и того же кода в каждый тестовый метод. Это похоже на меньшее из двух зол. Есть ли лучший способ создать одноразовый объект перед каждым тестом и удалить его после каждого теста, который не приведет к предупреждению CA1001?
Благодарим за помощь заранее.
* «Я не могу просто реализовать IDisposable на тестовом класс, потому что только один тестовый объект создается для всех методов испытаний». * Не с кодом вы публикуемым, '[TestInitialize]' прогонами ** каждый тест * * не только один раз. Если вы хотите запустить его один раз, вам нужно использовать '[ClassInitialize]'. Попробуйте добавить вызовы трассировки к функции инициализации, вы увидите, что ее вызывали каждый метод. –
На самом деле с VS 2013 (и я подозреваю, 2012 год), среда тестирования создаст экземпляр тестового класса для каждого теста, поэтому реализация IDisposable будет работать так, как вы этого хотите. –
Считаете ли вы, что вы получаете много работы от FxCop на тестовых сборках? Я никогда не видел необходимости делать это. Просто слишком много ложных срабатываний. –