Подтвердить что ты не робот

Атрибут ClassInitialize в классе unit test, который не называется

Я добавил этот метод в класс TestBase:

[ClassInitialize]
public static void InitializBeforeAllTests()
{
}

Но когда я запускаю в Debug unit test Test1():

[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
    }

Метод TestBase.InitializBeforeAllTests() никогда не вызывается. Почему?

4b9b3361

Ответ 1

При объявлении атрибута ClassInitialize для метода метод должен быть static, public, void и должен принимать один параметр типа TestContext.

Если у вас есть и другой метод с атрибутом AssemblyInitialize на том же unit test, тест будет запущен, но пропустит все методы тестирования и перейдет непосредственно к AssemblyCleanup или просто закроется.

Попробуйте пример атрибута ClassInitialize в MSDN.

Ответ 2

по какой-либо причине структура unit test UnitTestExecuter разрешает определять только один ClassInitialize и один класс ClassCleanup для каждого класса тестирования... в отличие от методов TestInitialize и TestCleanup, которые вызываются как в производном, так и в базовом тестовом классе...

Ответ 3

Вы можете настроить метод инициализации сборки в базовом классе. Не совсем то же самое, что ClassInitialize, но это жизнеспособный вариант. Источник: Обходное решение, упомянутое здесь.

[TestClass]
public abstract class TestBase
{
    [AssemblyInitializeAttribute]
    public static void Initialize(TestContext context)
    {
        // put your initialize code here
    }
}

Вы также можете добавить метод очистки:

[AssemblyCleanup]
public static void Cleanup()
{
   //clean up stuff here
}

Ответ 4

Ссылка MS больше не работает. В любом случае, один из способов обойти эту проблему - просто переместить код инициализации в конструктор базового класса. Это гарантирует, что он будет вызван из любых классов потомков всякий раз, когда они создаются.

[TestClass]
public class TestBase
{
    public TestBase()
    {
        // Initialization Code
    }
}

[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
        // At this point the base constructor should have been called
    }
}

Ответ 5

В моем случае я применил атрибут [Ignore] (тест запускается вручную)
Это вызвало [AssemblyInitialize] никогда не вызываться

Если я удалил атрибут [Ignore] [AssemblyInitialize] был вызван, как и ожидалось.

Как ни странно, [AssemblyCleanup] все еще вызывается с или без [Ignore] примененного к моему тесту