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
我已经用 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