Rad Studio 中的 DUnitX 中不调用 SetUp

SetUp is not called in DUnitX in Rad Studio

我已经用 C++ 为 Rad Studio Berlin 构建了 DUnitX 示例。 该代码是以下内容的副本:http://docwiki.embarcadero.com/RADStudio/Seattle/en/DUnitX_Overview

header是:

 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++ 来说似乎没有必要。我错过了什么吗?

我有同样的问题。

作为解决方法,我开发了一个小帮手 class:

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 基类下面的两个虚拟方法 class:

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 ...

使用:

class __declspec(delphirtti) TestCalc : public TTestCase

而不是

class __declspec(delphirtti) TestCalc : public `TObject