Классы, отмеченные с помощью TestInitialize и TestCleanup, не выполняются

Я боролся с этим, надеюсь, это поможет кому-то другому.

Во время создания модульных тестов с использованием MsTest я обнаружил, что повторял один и тот же код в каждом тесте и нашел несколько удобных атрибутов (TestInitialize, TestCleanup, ClassInitialize и ClassCleanup).

Предположительно, когда вы отмечаете метод с одним из этих атрибутов, он должен выполняться автоматически (перед каждым тестом, после каждого теста, перед всеми тестами и после всех тестов соответственно). Разочарочно, этого не произошло, и мои тесты не удались. Если напрямую вызвать эти методы из классов, помеченных атрибутом TestMethod, тесты прошли успешно. Было очевидно, что они не выполнялись сами.

Вот пример кода, который я использовал:

[TestInitialize()]
private void Setup()
{
    _factory = new Factory();
    _factory.Start();
}

Итак, почему это не выполняется?

Ответ 1

Трюк заключается в том, чтобы сделать эти методы public:

[TestInitialize()]
public void Setup()
{
    _factory = new Factory();
    _factory.Start();
}

Если они private, они не выполняются.

Ответ 2

TestInitialize и TestCleanup запускаются до и после всех тестов, но не до и после каждого.

Это неправильно, см., например, эту ссылку: http://social.msdn.microsoft.com/Forums/en-US/vststest/thread/85fb6549-cbaa-4dbf-bc3c-ddf1e4651bcf

См. также MSDN

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.classinitializeattribute.aspx

В примере кода показано, как использовать TestInitialize, ClassInitialize и AssemblyInitialize.

Ответ 3

У меня также была проблема и - из-за моего непонимания о том, как вызовы методов вызваны - решил это с помощью этого: Сделайте ваши тесты наследуемыми от класса, содержащего методы TestInitialize и TestCleanup.