在Rad Studio中的DUnitX中不调用SetUp

时间:2016-08-29 16:38:34

标签: c++builder dunitx

我在C ++中为Rad Studio Berlin构建了DUnitX的示例。 代码是: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 个答案:

答案 0 :(得分:2)

我有同样的问题。

作为一种解决方法,我开发了一个小帮助类:

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
}

答案 1 :(得分:0)

解决此问题的一种方法是重写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 ...

答案 2 :(得分:0)

使用

__declspec(delphirtti)类TestCalc:公共 TTestCase

代替

类__declspec(delphirtti)TestCalc:公共` TObject