我在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 ++。我错过了什么吗?
答案 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