2

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++ では不要のようです。何か不足していますか?

4

3 に答える 3

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
}
于 2016-10-28T11:48:06.390 に答える
0

この問題を解決する 1 つの解決策は、TObject 基本クラスの次の 2 つの仮想メソッドをオーバーライドすることです。

virtual void __fastcall AfterConstruction(void);
__fastcall virtual ~TTestCalc(void);

最初のメソッドは、オブジェクトが作成された後に実行され、SetUp を呼び出します。2 番目のメソッドは、仮想デストラクタをオーバーライドして 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 ...
于 2018-11-23T23:40:09.990 に答える