2017-11-23 2 views
0

테스트해야하는 방법이있다 변화 경로?테스트에서 스텁을 추가하는 방법은 무엇입니까? 사항 setData 방법에 관계없이 시험에 호출 될 때</p> <pre><code>void DATA::setData(QString path) { ........................... QDir dir(path); if (dir.exists()) { ................... } } </code></pre> <p>어떻게 든 반환 사실이 있도록 dir.exists()에 그루터기를 넣어 그것을 가능 :

P. 나는 Google Mock과 Google Test를 사용합니다.

+0

Google 모크로 도서관 수업을 모의 할 수 있습니다. QDir mock 클래스를 생성하고 특정 상황에서 원하는 것을 리턴하기 위해 exists() 메소드를 구현해야한다. http://alexott.net/en/cpp/CppTestingIntro.html#gmock-example 링크를 전달하는 데 도움이되는 링크 일 수 있습니다. – talamaki

답변

0

QDir 클래스에는 가상 메서드가 없으므로 모의하기가 매우 어렵습니다. 당신은 here이라는 속임수를 쓸 수는 있지만 템플릿을 사용해야합니다. (당신이 선호하는 경우, 또는 참조)에 MyAbstractQDirInterface 클래스에 포인터를 허용하도록 setData 서명을 변경 약간

class MyAbstractQDirInterface { 
public: 
    MyAbstractQDirInterface() = default; 
    virtual ~MyAbstractQDirInterface() = default; 
    virtual bool exists() = 0; 
}; 

class MyConcreteQDirInterface: public MyAbstractQDirInterface { 
public: 
    MyConcreteQDirInterface() = default; 
    ~MyConcreteQDirInterface() override = default; 
    bool exists() override { 
     // here call the real QDir::exists 
    } 
}; 

class MyQDirInterfaceMock: public MyAbstractQDirInterface { 
public: 
    MOCK_METHOD0(exists, bool()); 
}; 

을하고 (나는 이런 식으로 할 것)을 할 수있는 다른 방법은 QDir의 추가 인터페이스를 정의하는 것입니다 :

void DATA::setData(MyAbstractQDirInterface* qdirInterface) 
{ 
    // ... 
    if (qdirInterface->exists()) { 
     // ... 
    } 
} 

그런 다음, 생산에 당신은 MyConcreteQDirInterface로하고 MyQDirInterfaceMock로 호출 할 수 있습니다 테스트 ENV이 메서드를 호출 할 수 있습니다.