2013-02-20 32 views
7

私はQT C++の世界にいます。私はQTestクラスを使ってTDDをやっています。特定の条件でテスト中のクラスによって例外がスローされることを確認したい。 Googleのテストを使用して、私のようなものを使用します。例外がスローされたことをQTestで確認する方法は?

EXPECT_THROW(A(NULL), nullPointerException); 

それはQTestでこの機能のようなものを存在していますか?少なくともそれをする方法は?

ありがとうございます!

+1

例外はQtの世界ではあまり一般的ではありません。 afaikにはQTestに特定のマクロはありませんが、try catchを使ってQVERIFYでテストをブロックすることができます。代わりに、qtとgoogle testを使用することもできます(いくつかの理由で、qtest imhoよりもはるかに優れています)。 – TWE

+0

はい、今度はgtestがQTestよりはるかに優れていることを認識しています。ありがとう! – Killrazor

+0

また、gtestはgmockをサポートしていますが、QTestではこのようなものはありません。 QTestは、実際の使用のためだけであり、良いUTのためではありません。 gtestを使用する場合、QTestから必要なのはQSignalSpyだけです。他のすべてのものはgtestのほうがはるかに優れています。 – ixSci

答えて

10

Qt5.3以来、QTestは欠落している機能を提供するマクロQVERIFY_EXCEPTION_THROWNを提供します。

+0

これの唯一の問題は、 '置換できない型の例外がスローされたり、式が例外を全くスローしなかった場合、テストに失敗が記録されますログとテストはそれ以上実行されません。つまり、何も**何らかの例外タイプ(または派生クラス)がスローされないかどうかをチェックすることができる、すぐに使えるソリューションはありません。 – rbaleksandar

5

このマクロは、原理を示しています。

typeid比較は特別な使用例であるため、使用しても使用しない場合もあります。テストしている例外からスローされた例外がマクロにも渡された場合でも、マクロはそのマクロを「失敗」させます。しばしばあなたはこれを望まないでしょうが、とにかくそれを投げました!

#define EXPECT_THROW(func, exceptionClass) \ 
{ \ 
    bool caught = false; \ 
    try { \ 
     (func); \ 
    } catch (exceptionClass& e) { \ 
     if (typeid(e) == typeid(exceptionClass)) { \ 
      cout << "Caught" << endl; \ 
     } else { \ 
      cout << "Derived exception caught" << endl; \ 
     } \ 
     caught = true; \ 
    } catch (...) {} \ 
    if (!caught) { cout << "Nothing thrown" << endl; } \ 
}; 

void throwBad() 
{ 
    throw std::bad_exception(); 
} 

void throwNothing() 
{ 
} 

int main() { 
    EXPECT_THROW(throwBad(), std::bad_exception) 
    EXPECT_THROW(throwBad(), std::exception) 
    EXPECT_THROW(throwNothing(), std::exception) 

    return EXIT_SUCCESS; 
} 

戻り値:

Caught 
Derived exception caught 
Nothing thrown 

あなたはQFAILで失敗を強制する必要がありますQTestのためにそれを適合させます。

+0

(catch(const exceptionClass&e){\ if(typeid(e)== typeid(exceptionClass){{'はstd :: exceptionから独立していますか? – ixSci

+0

例外が 'exceptionClass'から派生していない、または派生していない場合、' catch'ブロックはスキップされるでしょう。 – cmannett85

+1

私は、catch(...)を追加して未処理のものとして数えれば十分です – ixSci

関連する問題