SetUp не вызывается в DUnitX в Rad Studio
Я построил пример для DUnitX для Rad Studio Berlin в C++. Код является копией: http://docwiki.embarcadero.com/RADStudio/Seattle/en/DUnitX_Overview
Заголовок:
class __declspec(delphirtti) TestCalc : public TObject
{
public:
virtual void __fastcall SetUp();
virtual void __fastcall TearDown();
__published:
void __fastcall TestAdd();
void __fastcall TestSub();
};
TestAdd и TestSub вызываются, потому что они находятся в __published, но SetUp и TearDown никогда не вызываются. Я понимаю, что они должны быть вызваны для каждого теста. Видя код Delphi, я вижу атрибут [Setup], но кажется, что для C++ нет необходимости. Я что-то пропустил?
3 ответа
У меня та же проблема.
В качестве обходного пути я разработал небольшой класс помощника:
template <typename T>
class TestEnviroment{
public:
TestEnviroment(T* theTest)
:itsTest(theTest)
{ itsTest->SetUp(); }
~TestEnviroment() { itsTest->TearDown(); }
private:
T* itsTest;
};
Какая первая локальная переменная в каждом тестовом примере:
void __fastcall UnitTest::Test()
{
TestEnviroment<UnitTest> testenv{this};
// TODO Testing
}
Одним из решений, которое решает эту проблему, является переопределение двух виртуальных методов ниже базового класса TObject:
virtual void __fastcall AfterConstruction(void);
__fastcall virtual ~TTestCalc(void);
Первый метод выполняется после того, как объект был создан и вызывает SetUp, а второй метод переопределяет виртуальный деструктор для вызова TearDown.
Комплексное решение:
class __declspec(delphirtti) TTestCalc : public TObject
{
public:
__fastcall virtual ~TTestCalc();
virtual void __fastcall AfterConstruction();
virtual void __fastcall SetUp();
virtual void __fastcall TearDown();
__published:
void __fastcall TestAdd();
void __fastcall TestSub();
};
//---------------------------------------------------------------------------
__fastcall TTestCalc::~TTestCalc()
{
TearDown();
}
//---------------------------------------------------------------------------
void __fastcall TTestCalc::AfterConstruction()
{
SetUp();
TObject::AfterConstruction();
}
//---------------------------------------------------------------------------
// Other methods ...
использовать :
класс __declspec(delphirtti) TestCalc: общедоступный TTestCase
вместо :
класс __declspec(delphirtti) TestCalc : public `TObject