2013-04-29 2 views
2

QT에서 내 프로젝트 용 테스트 클래스를 구현 중입니다. 모든 공용 함수에 대한 테스트를 추가했지만 테스트에 포함시키고 싶은 몇 가지 개인 함수가 있습니다.테스트 클래스에서 개인 함수를 호출 할 수 있습니까 QT

분명히이 개인용 멤버 함수이기 때문에 작동하지 않을 수 있습니다.하지만이 테스트 케이스에서 액세스하려는 경우 기본으로 무시할 수 있는지 궁금해합니다. 특히 내 코드를 변경하여 내 테스트를 변경하지 않으려 고합니다. 그게 정말 도움이되지 않기 때문에 일하고, 이드처럼 개인적인 기능을하지만 나는 또한 그들을 테스트 할 수 있기를 원합니다.

누구나 가능한지 또는 내 기능을 보호 대상으로 변경하고 내 테스트를 위해 클래스를 상속해야하는지 궁금한가요?

답변

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 비트를 이해하지 못해서 코드를 업데이트 할 수 있습니까? 현재 친구 클래스에 오류가 많아서 'friend class testerClass'이어야합니다. – AngryDuck

+0

방금 ​​업데이트했습니다. 테스트 해주십시오. 다시? –

+0

건배 이제 완벽하게 작동합니다 ^^ – AngryDuck

1

옵션 하나. 귀하의 기능은 단순히

#define UNIT_TEST 
#include <Testee.h> 

이 따라하기 때문에 테스트 및 응용 프로그램이 같은 프로젝트 (프로그램)에있는 경우 조금 위험하다, 테스트 헤더에

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

class Testee 
{ 
    public: 
    .... 


    ut: 
    //private functions to be tested 


    ptivate: 
}; 

그런 다음, 개인 조건부 공개 될 수있다 표준에 따라 클래스 정의는 동일한 프로그램의 모든 번역 단위에서 동일해야하며 그렇지 않으면 정의되지 않은 동작이어야합니다.

둘째, 쉽고 안전한 옵션은 Tester 클래스를 친구로 선언하는 것입니다.

class Testee 
{ 
    public: 
    .... 

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

언급 할만한 또 다른 문제는 이러한 액세스 한정자를 스왑하면 클래스의 메모리 레이아웃을 변경할 수있는 좋은 기회입니다. 결국 표준은 동일한 액세스 수정자를 사용하는 멤버가 선언 된 동일한 상대적 순서로 메모리에서 발생 함을 보장합니다. – Agentlien

+0

그래서 내 개인적인 함수를 포함하고있는 개인 클래스에 private 멤버로 '친구 클래스 테스트'를 추가했습니다. 방금 시도했기 때문에 개인 멤버 변수에 액세스 할 수 없다고 말합니다. – AngryDuck

+0

@AngryDuck : 중요하지 않습니다. 'friend class TesterClass;'를 추가합니다 - public 또는 private 영역. 추가하면 TesterClass의 모든 기능이 Testee의 개인 회원에 액세스 할 수있게됩니다. –

관련 문제