2013-10-01 3 views
0

Фон: у меня есть куча модульных тестов в .NET, для которых необходимо настроить некоторые данные конфигурации для запуска. Первоначально я использовал TestInitialize и TestCleanup для настройки и сбрасывания данных конфигурации вокруг каждого теста; однако для всего набора тестов достаточно одной установки, поэтому я предпочел бы вместо этого использовать ClassInitialize и ClassCleanup.Почему атрибут ClassCleanup должен быть статическим?

Проблема: Когда я изменить атрибут из TestInitialize в ClassInitialize и запустить тесты, я получаю следующее сообщение об ошибке:

MyTestClass.ClassInit has wrong signature. The method should be marked static.

Каковы причины дизайна позади этого атрибута, требующего его метод быть статическими? Все мои методы тестирования - это методы экземпляра, поэтому я бы предположил, что хотя бы один экземпляр моего тестового класса создается где-то для их запуска. Почему этот экземпляр не будет отвечать за очистку после?

Я проверил MSDN, и они явно не упоминают статическое требование, хотя у них есть хороший пример его использования.

+0

вы можете показать на '[ClassInitialize]' декорированный код метода? это должно быть как «public static void MethodName (контекст TestContext)» в VB.Net 'Public Shared Sub MethodName (ByVal testContext As TestContext)' – Damith

+0

Я знаю, что он должен быть статическим; сообщение об ошибке достаточно ясно. Мой вопрос заключается в том, почему он не может быть методом экземпляра. – user1968292

ответ

2

В MSDN заявляет ClassInitializeAttribute

Identifies a method that contains code that must be used before any of the tests in the test class have run and to allocate resources to be used by the test class. This class cannot be inherited.

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

class foo 
{ 
    static someObject bar; 
    int foobar; 

    public foo() 
    { 
    this.foobar = foo.bar.SomeMethod() 
    } 
} 

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

Другой случай, вы можете захотеть использовать ClassInitializeAttribute для назначения глобальных объектов, что тест может использовать (например, mock базы данных и т.д.)

+0

Звучит разумно. Спасибо, что нашли время ответить! – user1968292