2016-11-03 17 views
2

C++とQtを使って既存のCコードを書き直すことを検討しています。 Cコードpollは、複数のソースからの入力をチェックするために使用され、各ソースにはタイムアウト値があり、特定の動作がそれに関連付けられています。インスタンスQTimerの制御時間?

  • のために5分後に私たちは、クライアントがsocket0 Aに接続された後、クライアントはsocket0
  • に接続することを期待intput0に沈黙を私たちは、他の側が死んでいると仮定して、我々は再確立接触
  • にしてみてくださいacceptに呼び出す(socket1)行われ、クライアントはsocket1はこの種のもの

を閉鎖される前に、要求をするために1分を取得しすぎではありませんdifficu (poll,gettimeofday)を「隠す」ことにより、ある程度の時間の経過とトリガタイムアウトを簡単に制御することができます。

Qtに移動する私は、QSocketNotifierの場合にフィールド記述子をラップし、activated(int)信号を適切なスロットに接続することを計画していました。それは基本的にQt風味のpollを提供します - ただしタイムアウトはありません!

タイムアウトの場合は、QTimerをそれぞれQSocketNotifierに結合します。私の実験は、これがうまくいくことを示しています。しかし、テストするのは楽しいことではありません。私は本当にタイムアウトのために座って5分待つというテストはできません。

このソリューションのタイムアウトをテスト可能にする方法を教えてください。

(または多分私はこのことについて間違った方法を考えている、と完全に異なる何かをする必要があります。)

+1

あなたは変数としてタイムアウトを設定することはできませんし、単体テストの前にそれを低いものに設定することはできませんか? – Hayt

+0

"unit"という言葉は実際には "unit tests"ではないので削除しました。私はタイムアウト時間を短縮することができますが、それは私が通常テストに近づく方法ではありません。私はむしろ環境を制御したいと思う(この場合は* time *)。この特定のケースでは、私はまた、統合テストでタイムアウトをテストしたい(我々はいくつかのプロセスが通信している)、タイムアウト値を変更するとより多くの意味がある。 – Magnus

+0

は設定可能なタイムアウトを持っていますが、素晴らしい機能です。私はそこで5分待たずにこれがどのように行われるのか分かりません。特にQtで。時間計測のための独自のフレームワークがあれば、5分先の時間を「設定」する機能を実装することができますが、時間的に相互依存する複数のプロセスでテストする場合にも問題が生じます。 (+ AFAIKではQtでこれを行うことはできません)。 – Hayt

答えて

4

私は質問のように言い換えることができると考えている「QTimer模擬する方法?」この言い換えられた質問への答えは「間接的」です。メイン・プログラムをQTimer以上の抽象度で書くことができます。このプログラムは、テスト・コードによって時間を基準にするのではなく、テストのニーズに基づいてシグナルを発するようになります。

これに近づく1つの方法は、テストコードがQTimerの信号からスロットを切り離し、その場所に独自の信号を接続することです。

+0

はい、標準的なオブジェクト指向のアプローチは、依存性注入による制御の逆転です。このアプローチは、名目上のタイピングを伴う言語ではやや苦痛でもあります。私は本当に 'QTimer'が他の方法でもテスト可能であることを期待していました。 – Magnus

+0

@Magnusテストしたいものを決めます。シグナルに対する反応をテストしたいですか?その後、何かから信号を放射します。あなたは 'QTimer'へのあなたの反応をテストしますか?それからあなたは 'QTimer'で立ち往生しています。 – Angew

+0

さて、信号に対する反応をテストしたいのですが、 'QTimer'インスタンスだけがシグナルをスロットに付けているので、ほとんど同じです。ここでは、単なる「ユニットテスト」(ここでは「ユニット」がクラス)については言及していないことに注意してください。 – Magnus

関連する問題