2015-04-29 10 views
2

У меня есть много классов тестов, подобных этому.Статический анализ выдает предупреждение в классе испытаний, когда объект находится в процессе тестирования.

[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?

Благодарим за помощь заранее.

+0

* «Я не могу просто реализовать IDisposable на тестовом класс, потому что только один тестовый объект создается для всех методов испытаний». * Не с кодом вы публикуемым, '[TestInitialize]' прогонами ** каждый тест * * не только один раз. Если вы хотите запустить его один раз, вам нужно использовать '[ClassInitialize]'. Попробуйте добавить вызовы трассировки к функции инициализации, вы увидите, что ее вызывали каждый метод. –

+2

На самом деле с VS 2013 (и я подозреваю, 2012 год), среда тестирования создаст экземпляр тестового класса для каждого теста, поэтому реализация IDisposable будет работать так, как вы этого хотите. –

+0

Считаете ли вы, что вы получаете много работы от FxCop на тестовых сборках? Я никогда не видел необходимости делать это. Просто слишком много ложных срабатываний. –

ответ

5

Лучшим способом я нашел, чтобы реализовать 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(); 
    } 
+1

Не обязательно отмечать его как 'TestCleanup', каждый объект будет располагаться каждый раз. –

+0

Хм, ты прав. Вы узнаете что-то каждый день, я думаю. – Erik

+0

@RonBeyer Отличный звонок! Я не знал, что Dispose будет вызываться между каждым тестом, если класс тестирования реализован как IDisposable. Мне нравится это решение, потому что это не связано с добавлением кода только для того, чтобы избавиться от предупреждений. –

1

Ошибка обращается к интерфейсу IDisposable на вашем TestClass. (Here - хорошее обсуждение, почему это необходимо). Его реализация должна быть как:

public class TestClass :IDisposable 
{ 

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

См: Implement IDisposable correctly

+0

Да, нет ничего, что говорит, что тестовые классы не могут быть «IDisposable», и тестовая среда правильно их использует. –

+0

Да, я мог бы реализовать IDisposable. В этом случае я просто добавляю код для удовлетворения предупреждения FxCop без какой-либо реальной стоимости, как и SuppressMessageAttribute. Я надеялся, что был образец, который хорошо играл с FxCop и не предполагал добавления кода с единственной целью избавиться от предупреждений. –

+0

@ r2_118, хорошо, если вы собираетесь иметь одноразовое поле в своем классе, правила говорят, что * этот * особый класс также должен быть одноразовым. – Habib

 Смежные вопросы

  • Нет связанных вопросов^_^