Атрибут 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
}
работал у меня.