【问题标题】:SetUp is not called in DUnitX in Rad Studio在 Rad Studio 的 DUnitX 中未调用 SetUp
【发布时间】:2016-08-29 16:38:34
【问题描述】:

我已经用 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++ 是没有必要的。我错过了什么吗?

【问题讨论】:

    标签: c++builder dunitx


    【解决方案1】:

    我也有同样的问题。

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

    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
    }
    

    【讨论】:

    • 在 CppBuilder 中使用 Dunitx 多一点后,我建议改用 Dunit(不带 X)。 CppBuilder 不支持 Dunitx 大量使用但 Dunit 不使用的 Delphi 属性。
    【解决方案2】:

    解决此问题的一种解决方案是覆盖 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 ...
    

    【讨论】:

      【解决方案3】:

      使用

      class __declspec(delphirtti) TestCalc : public TTestCase

      代替

      class __declspec(delphirtti) TestCalc : public `TObject

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多