2013-04-29 59 views
2

我正在QT中为我的项目实施测试类。我已经添加了所有公共函数的测试,但是有几个私有函数可以包含在我的测试中。是否可以从测试类中调用私有函数QT

显然这不会工作,因为他们是私人会员功能,但我想知道如果这是能够绕过的基础上,我想从测试案例访问他们,我不特别想改变我的代码,以便我的测试工作,因为这不是真的有用,id像功能是私人的,但我也希望能够测试它们。

只是想知道是否有人有任何想法是否这是可能的,或者如果我需要改变我的功能保护或什么,然后继承我的测试类?

回答

2

这是通常的做法,只是单元测试公共职能,但你可以使测试类作为原始类的朋友。类似的东西:

朋友的减号应该在#define UNIT_TEST标志内。

#include <iostream> 

class ToTestClass 
{ 
#ifdef UNIT_TEST 
    // ToTestClass declares TesterClass as a friend. 
    friend class TesterClass; 
#endif 

private: 
    void privateMethod() 
    { 
     std::cout << "hey there" << std::endl; 
    } 
}; 

class TesterClass 
{ 
public: 
    TesterClass() 
    { 
     ToTestClass totest; 
     // TesterClass now has access to ToTestClass's private members and methods. 
     totest.privateMethod(); 
    } 
}; 

int main() 
{ 
    TesterClass tester; 
    return 0; 
} 
+0

对不起,我不明白#define位可以更新你的代码,因为截至目前,我有很多错误,把朋友作为一个类,它应该是'朋友类testerClass' – AngryDuck 2013-04-29 10:25:00

+0

我刚刚更新,你可以请测试再次? – 2013-04-29 10:36:23

+0

干杯现在完美工作^^ – AngryDuck 2013-04-29 10:40:56

1

选项一。你的功能可能是有条件的公私

#ifdef UNIT_TEST 
#define ut public 
#else 
#define ut private 

class Testee 
{ 
    public: 
    .... 


    ut: 
    //private functions to be tested 


    ptivate: 
}; 

然后,在您的测试头,简单

#define UNIT_TEST 
#include <Testee.h> 

这是有点危险的,如果测试和应用程序是在同一个项目(程序)根据原因在标准中,类定义在同一个程序中的所有翻译单元中必须相同,否则为未定义的行为。

其次,更简单和更安全的选择是将测试者类声明为朋友。

class Testee 
{ 
    public: 
    .... 

    ptivate: 
    .... 
    friend class Tester; 
}; 
+0

另一个您可能想要提到的问题是,交换这些访问修饰符有很好的改变类的内存布局的机会。毕竟,标准保证使用相同访问修饰符的成员以与它们声明相同的相对顺序出现在内存中。 – Agentlien 2013-04-29 10:15:20

+0

因此,在我的班级,包含我的私人功能,我想测试,作为私人成员我添加'朋友类测试;'因为我只是试过这个,它仍然说不能访问私有成员变量 – AngryDuck 2013-04-29 10:17:29

+0

@AngryDuck:没关系你添加'朋友类TesterClass;' - 公共或私人区域。添加完成后,TesterClass的所有功能都将访问Testee的私有成员。 – 2013-04-29 10:27:57

相关问题