NUnit не подчиняется наследованию атрибутов
у меня проблема с NUnit-интересно, есть ли у кого-нибудь идеи.
мы используем NUnit 2.5.3.9345 и C# 3.5.
рассмотрим следующий код:
public class UnitTestBase
{
[TestFixtureSetUp]
public void SetUpTestFixture()
{
//Do something in base
}
}
[TestFixture]
public class SomeTestClass : UnitTestBase
{
[TestFixtureSetUp]
public void FixtureSetUp()
{
//Do something in test class
}
[Test]
public void SomeTest()
{
//Some assertion
}
}
по словам документация, если я сбегу SomeTestClass.SomeTest()
, UnitTestBase.SetUpTestFixture()
стоит перед SomeTestClass.FixtureSetUp()
.
Это не так - базовый метод будет вызываться только в том случае, если я не предоставлю [TestFixtureSetUp]
метод в производном классе.
любые идеи, пожалуйста? Я действительно ... озадачен!
спасибо.
5 ответов
у меня нет проблем. Я проверил результат следующим образом:
Производный Тест
[TestFixture]
public class DerivedTest : TestBase
{
[TestFixtureSetUp]
public void FixtureSetup()
{
File.AppendAllText("Out.txt", string.Format("TestFixtureSetUp From DerivedTest{0}", Environment.NewLine));
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
File.AppendAllText("Out.txt", string.Format("TestFixtureTearDown Down From DerivedTest{0}", Environment.NewLine));
}
[SetUp]
public void Setup()
{
File.AppendAllText("Out.txt", string.Format("Setup From DerivedTest{0}", Environment.NewLine));
}
[TearDown]
public void Down()
{
File.AppendAllText("Out.txt", string.Format("TearDown From DerivedTest{0}", Environment.NewLine));
}
[Test]
public void DoATest()
{
File.AppendAllText("Out.txt", string.Format("Did a Test{0}", Environment.NewLine));
}
}
сайту testbase
public class TestBase
{
[TestFixtureSetUp]
public void BaseTestFixtureSetUp()
{
File.AppendAllText("Out.txt", string.Format("TestFixtureSetUp From TestBase{0}", Environment.NewLine));
}
[TestFixtureTearDown]
public void BaseTestFixtureTearDown()
{
File.AppendAllText("Out.txt", string.Format("TestFixtureTearDown From TestBase{0}", Environment.NewLine));
}
[SetUp]
public void BaseSetup()
{
File.AppendAllText("Out.txt", string.Format("Setup From TestBase{0}", Environment.NewLine));
}
[TearDown]
public void TearDown()
{
File.AppendAllText("Out.txt", string.Format("TearDown From TestBase{0}", Environment.NewLine));
}
}
это производит следующий вывод:
TestFixtureSetUp From TestBase
TestFixtureSetUp From DerivedTest
Setup From TestBase
Setup From DerivedTest
Did a Test
TearDown From DerivedTest
TearDown From TestBase
TestFixtureTearDown Down From DerivedTest
TestFixtureTearDown From TestBase
я смог протестировать выход с помощью бета-версии ReSharper 5 и NUnit GUI v 2.5.3.9345 (32-бит)
редактировать Во время работы тестовый бегун в ReSharper 4.5 работал неправильно, однако запуск встроенного тестового проекта в x86 и x64 с соответствующим NUnit.exe / NUnit-86.exe произвел допустимый вывод.
обходной путь / другой способ сделать это:
вместо того, чтобы полагаться на поведение, которое не сразу понятно, сделайте что-то вроде этого, используя шаблон метода шаблона, чтобы сделать порядок явным, используя функции обычного языка:
public class UnitTestBase
{
protected abstract void PerFixtureSetUp();
[TestFixtureSetUp]
public void SetUpTestFixture()
{
PerFixtureSetUp();
}
}
[TestFixture]
public class SomeTestClass : UnitTestBase
{
protected override void PerFixtureSetUp()
{
}
[Test]
public void SomeTest()
{
//Some assertion
}
}
каждый раз, когда у меня была причина использовать унаследованные светильники или тестовые контексты, этот способ работал достаточно хорошо. :)
моя проблема с опорой на атрибуты заключается в том, что, поскольку эти типы создаются и вызывается через отражение в Бегуне без связи между методами (без полиморфизма), сложнее рассуждать о порядке, в котором они называются. Использование стандартных языковых функций помогает немного упростить это.
вы пытались дать базовому классу атрибут [TestFixture]? Я не знаю, что это исправит, но, похоже, стоит попробовать... идея заключается в том, что NUnit может игнорировать атрибуты базового класса, если это не TestFixture.
Да, я играл с этим в течение последних получаса, и это определенно ошибка. Я попытался добавить TestFixture ко всем классам, а также иметь разные комбинации. Я также пробовал методы static и instance. Он просто не хочет играть красиво! :-(
в любом случае, лучшее решение, которое я мог найти, - это поместить код TestFixtureSetUp в конструкторы вашего тестового класса и базового класса. По крайней мере, тогда вы можете быть уверены в наследство и больше ясно для других читателей вашего кода, которые, возможно, не знают внутреннюю работу NUnit :-)
с чем вы проводите свои тесты? Поведение, которое вы испытываете, не связано с NUnit (framework), а скорее с бегуном, который вы используете. Вы используете ReSharper интегрированный testrunner?