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

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