Атрибут ClassInitialize в классе unit test, который не называется
Я добавил этот метод в класс TestBase:
[ClassInitialize]
public static void InitializBeforeAllTests()
{
}
Но когда я запускаю в Debug unit test Test1()
:
[TestClass]
public class TestMapping : TestBase
{
[TestMethod]
public void Test1()
{
}
Метод TestBase.InitializBeforeAllTests()
никогда не вызывается.
Почему?
Ответы
Ответ 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]
примененного к моему тесту