2017-05-23 6 views
0

は、私はクラスがあると接続シグナルとスロットを維持入れ替えることができます:私はQObjectの子が

class Foo : public QObject{ 
Q_OBJECT 
public: 
    ... 
private: 
    Bar* m_bar; 
} 

そして、何らかの理由を、私はDerivedBarのオブジェクトへのポインタでm_barを交換したいと思います。よく私が見つけたユースケースは、単体テストのためにMockBarのオブジェクト(google mockフレームワークを使用)に置きたいときです。

Foo(Bar* bar, QObject* parent) 

とばかりに応じm_bar設定:

今、私はほとんどの場合、私はちょうどのようなものにするためにコンストラクタを拡張することができ知っています。

しかし、問題は、クラスがQWidgetsであり、Qtデザイナーを使用してそれらをアセンブルしていることです。 FooとBarはウィジェットであり、BarはデザイナーからFooの内部に置かれていると想像してください。それらの接続もデザイナーを介して設定されます(qmlファイルに格納されます)。 (単に機能取得しようとし、ここで任意のメモリリークを無視して)を

Bar* bar = foo.findChild<Bar*>(); 
bar = new MockBar(&foo); 

しかし、私は期待を設定するために行くとき、既存のものだったように接続されていないようです。私のようなものを試してみました。信号に応答してスロットは呼び出されません。私はこれが接続が行われる方法のためにこれが完全に予期しないとは思わないが、私が探している効果を得る方法があるのだろうかと思っている。


(NB:今のところ、QT 4.8とgcc 4.6を使用して、C++

答えて

0

のためのいくつかのオプションがここで私が見つけた良い答えだ制限を行います。私にとっての問題は、と関係して、最終的ですしかし、Ui :: FooWidgetクラスは関数的にちょうどpimplパターンなので、ローカルコピーへのポインタを作成し、Fooのコンストラクタを変更して、オプションでui実装を挿入できるようにします。 BarWidgetを直接呼び出して、そのuiのbarWidgetオブジェクトをMockBarWidgetに置き換えて、期待値などを設定してテストを実行することができます。前の回答は、2つのウィジェット間のやり取りsは信号/スロット接続の1つです。


前の回答:

ここで私がこれまでに見つけた答えは一つだが、私はあまりそれ好きではない:

Bar* bar = foo.findChild<Bar*>(); 
bool connectTest = QObject::connect(&foo, SIGNAL(setValue(int)), bar, SLOT(setValue(int)), Qt::UniqueConnection); 
ASSERT_FALSE(connectTest); 
bar = new MockBar(&foo); 
connectTest = QObject::connect(&foo, SIGNAL(setValue(int)), bar, SLOT(setValue(int)), Qt::UniqueConnection); 
ASSERT_TRUE(connectTest); 
//... rest of test 

私はおそらくいくつかの中で全体を包むことができヘルパー関数の種類があります。この関数は、シグナルとスロットをメソッドポインタとすることができるC++ 11/Qt5ではより優れています。しかし、私はそれを行う簡単な方法が欠けているのだろうかと思います。


編集:それは、このパターンは、試験の偽陽性、唯一の最初の「connectTest」部分は、行動の有効なテストを与えていた私を与えていたが判明しました。この欠陥は、Fooがbarにシグナルを送出しないときにはっきりしますが、単にbarのメソッドを呼び出すだけです。モックはこのパターンで注入されません。

+0

あなたは何を求めているのですか?接続リストを列挙する方法はありますか?正式ではありませんが、プライベートAPIを使用するのは簡単なことですが、これはテストのためだけに行われるため大変なことではありません。互換性のあるスロットを持つ別のオブジェクトに接続のスロットエンドポイントを転送して、接続を複製する必要性を排除することもできます。いくつかの接続を複製することは苦痛であるか、不可能である。ファンクタへの接続。 –

+0

ありがとう、私はいくつかの私の問題を修正する可能性があるので、そのアプローチを見ていきます。しかし、信号/スロットの動作を調べるのではなく、バーで直接関数呼び出しをしようとすると問題が発生する可能性があります。 – shavera

関連する問題