Атрибут ClassInitialize в классе на основе модульного теста не вызывается

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

[ClassInitialize]
public static void InitializBeforeAllTests()
{
}

Но когда я запускаю в Debug модульный тест Test1():

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

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

7 ответов

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

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

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

я знаю, что это очень старый вопрос, но он первым всплывает в поиске Google при поиске подобной проблемы, во всяком случае, вот обновление для ответа:

       [ClassInitialize(InheritanceBehavior.BeforeEachDerivedClass)]
 public static void YOUR_INIT_METHOD_NAME(TestContext context)

Примечание. Для этого вам потребуется пакет MSTest.TestFramework-Version 2.0.0 или новее.

Вы можете настроить метод инициализации сборки в своем базовом классе. Не совсем так же, как 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
}

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

Ссылка 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
    }
}

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

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

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

В моем случае[ClassInitialize]метод никогда не вызывался из-за того, что я не прошелTestContextв качестве параметра. Даже если это необязательно, я думаю, вам придется передавать его каждый раз, даже если вы не используете его в методе.

Итак, подпись метода

      [ClassInitialize(InheritanceBehavior.None)]
public static void OnClassInitialize(TestContext context)
{
    // Log in to the system
}

работал у меня.

Другие вопросы по тегам