2011-08-24 21 views
3

内部にタイマー機能を持つ私のプログラムにgoogle testを使いたいです。 タイマーはWindowsのSetTimer()によって実装されており、タイムアウトメッセージを処理するためにmain()にメッセージキューがあります。メッセージキューに基づいてWindowsアプリケーションでGoogleテストを使用するにはどうすればよいですか?

while (GetMessage(&msg, NULL, 0, 0)) { 
    if (msg.message == WM_TIMER) { 
     ... 
    } 
    DispatchMessage(&msg); 
} 

Googleテストでは、RUN_ALL_TESTS()を呼び出してテストを開始します。

int main(int argc , char *argv[]) 
{ 
    testing::InitGoogleTest(&argc , argv); 
    return RUN_ALL_TESTS(); 
} 

私の質問は、これらの2つの部分をどのように統合できるかということです。私のコードのいくつかの機能がメッセージを送信するので、私はそれを処理するために同じメッセージキューメカニズムを持っている必要があります。

これは、各テストケースでメッセージキュー処理を記述する必要があることを意味しますか?実行可能な方法ですか?

TEST() 
{ 
    ... message queue here ... 
} 

この種のテストを行う適切な方法はありますか? ありがとうございます。

答えて

1

テストするコードは、メッセージキューメカニズムに依存しているようです。あなたがメッセージを送信する必要があるすべてのクラスに注入します。このような抽象的なメッセージ・ハンドラ・クラスを実装する場合は、テスト容易性を向上させることができます:

class MessageHandler 
{ 
    virtual void DispatchMessage(Msg messageToBeDispatched) = 0; 
} 

を今、あなたはproductivのために、テストの目的のために異なるメッセージハンドラを実装できます。

あなたのコードで
class TestMessageHandler : public MessageHandler 
{ 
    void DispatchMessage(Msg messageToBeDispatched) 
    { 
    // Just testing, do nothing with this message, or just cout... 
    } 
} 

class ProductiveMessageHandler : public MessageHandler 
{ 
    void DispatchMessage(Msg messageToBeDispatched) 
    { 
    // Now do the real thing 
    } 
} 

あなたは今、「ProductiveMessageHandler」または「TestMessageHandler」のいずれかを注入でき、またはあなたも期待をテストするためにGoogleMockを使用して嘲笑テストハンドラを使用することができます。

class MyProductionCode 
{ 
    MyProductionCode(MessageHandler *useThisInjectedMessageHandler); 
} 

あなたtestcodeは、次のようになります。

class TestMyProductionCode : public ::testing::Test 
{ 
    TestMessageHandler myTestMessageHandler; 
} 

TEST(TestMyProductionCode, ExampleTest) 
{ 
    MyProductionCode myTestClass(&myTestMessageHandler); 

    ASSERT_TRUE(myTestClass.myTestFunction()); 
} 
関連する問題