2017-04-14 8 views
0

googlemockとgoogletestの助けを借りて、テスト対象のメソッドで異なる模擬エラーが正しく処理されているかどうかを確認するテストを設定します。基本的に私のコードは次のようになります。googlemock動作のばらつきが小さい場合は、

// setup mock object, and object under test 

    // setup initial EXPECT_CALL expectations 

    // this expected method call in the middle mocks a failure 
    EXPECT_CALL(*mock, method(arg_in)). 
    Times(1). 
    WillOnce(Throw(exception_of_type_A)); 

    // setup cleanup EXPECT_CALL expectations 

    // Now invoke method in object under test. 
    // Expect exception has been translated to different type. 
    EXPECT_THROW(x.method_under_test(), exception_type_B); 

    // destructor of mock object will check the mock method invocations 

今ここで失敗した私のモックメソッドが唯一のタイプAの例外をスローすることではなく、タイプBの例外をスローすることによって、または予期しない戻り値を返すことで失敗することはできません。

完全にTEST()をコピーして貼り付け、誤った虚偽のメソッド1が何をするかを変更するだけで、これを簡単に実装できます。しかし、これはコードを乱雑にするでしょう。私がこれらの3つのテストがまったく同じであることを文書化しても、WillOnce()アクション仕様で嘲笑されたメソッド1が失敗する方法を除いて、人間の読者はこれがまだ真実であるかどうか慎重に比較する必要があります。

googletest/googlemockで3つのTESTS間で共通コードを共有し、それらがWillOnce()アクションで異なるようにする正しい方法は何ですか?

マクロには、マクロ、WillOnce()アクション、googletestフィクスチャ、静的ヘルパーメソッドを使用してコンテナをループしてセットアップとクリーンアップを行います。

私はまだgoogletestには新しく、これに対処する方法が不明です。

答えて

0

今のところ、私は、パラメータとしてアクションを受け入れテンプレート静的関数のテストロジックを実装します。これは、それが行われ、あるいはすべきかである場合

template <typename A> 
static void paramererizeable_test(A failingAction) { 
    // set everything up 
    EXPECT_CALL(*mock, method(arg_in)). 
    Times(1). 
    WillOnce(failingAction); 
    // set up more expectations 
    // trigger the calls 
} 

TEST(Section, Method) { 
    paramererizeable_test(Throw(exception_of_type_A)); 
    paramererizeable_test(Throw(exception_of_type_B)); 
    paramererizeable_test(Return(unexpected_return_value)); 
} 

わからない良い方法があればしかし、それは動作し、可読です。

関連する問題