2012-05-07 11 views
2

問題が少しあります。私は現在、テストしたい巨大なプロジェクトを持っており、そのほとんどはQNetworkAccessManagerが実際に呼び出しにどのように応答するかに完全に依存しています。結果を得るために私は実際に手動でイーサネットコードを座って引っ張ることができないので、私は偽のQNAMを作りたいと思っています。私は通常、クラスが壊れている同じインターフェースを壊してしまい、それを使っているオブジェクトにベースクラスポインタを持たせ、偽物と正しいものの両方を扱うことができるようにします。偽のQNetworkAccessManagerを作成するには

InterfaceQNAM &_manager; // should have virtual put, post, finished() etc that both 
         // the real QNAM and the fake one would derive 

ただし、 Qtは実際にインターフェイスを行い、QNAMはQOobjectから継承するだけで、私は自分のコードで緩んでいないようにしたいだけです。QObject(仮想put、postなどがあります)をすべて呼び出すようにクラスに指示してください。クラス内でコードの変更が多すぎる必要があります(キャスト、どちらに注入するかによって2つの異なるオブジェクトがあります)。どうすればこの問題を解決できますか?

要求されたbrachの変更QtMockを見ましたが、ドキュメントが不足しているため、起動して実行できませんでした。

また、QNAMからdervieを起動しましたが、私はそれを使用していないので、私はそれを選択しませんでした。それは、その後、REST要求を行い、それが終了しています時にチェックするためにQNAMを使用します

class BaseRequest : public QObject { 

    Q_OBJECT 

protected: 
    QNetworkAccessManager &_manager; 
    QPointer<QNetworkReply> _reply; 
    QPointer<IParser> _parser; 


public: 
    BaseRequest(QNetworkAccessManager &manager, IParser *parser = 0, QObject *parent = 0) 
     : QObject(parent), _manager(manager), _reply(0), _retryCount(0), _parser(parser) {} 

    virtual ~BaseRequest(); 
} 

私のクラスには、次のようになります。

私はこのコードにあまりにも多くの変更を加えることなく挿入できる偽のQNAMをどうすればできますか?これを解決する良いデザインパターンや何かがありますか?

+0

を明確にしてください:あなたは本物のように見えますが、異なる実装の代替QNAMを取得しようとしていますか?このような場合は、QNAMから派生し、「偽の」機能で「完全な」機能を非表示にします。 –

+0

@FèlixGalindoAllué私は同じことを提案しようとしましたが、プロジェクトの残りのQNAMへのすべての参照/ポインタを新しく派生した型を参照しなければならないことに注意してください。そうしないと隠蔽は機能しません。すばやい検索交換が動作する場所のすべてのソースが可能であれば、これが可能です。さもなければ、これは非常に乱雑になります(もし可能ならば、単なるレベルの乱雑です)。 – tmpearce

+0

私はQNAMをテスト用に作成しようとしていますが、ロジックを含んでいませんが、エラーをシミュレートしようとしている間違いに応じて信号とエラーコードを出力します。 – chikuba

答えて

2

、私は詳細な回答を提案してみましょう:

class MyNAM : public QNetworkAccessManager 
{ 
    bool fakedNAM; // with setter and getter functions also... 
    ... 
    QNetworkReply * post (const QNetworkRequest & request, const QByteArray & data) 
    ... 
} 

... 

QNetworkReply *MyNAM::post (const QNetworkRequest & request, const QByteArray & data) 
{ 
    if (fakedNAM) { 
    // your debugging code 
    } 
    else { 
    return QNetworkAccessManager::post(request, data); 
    } 
} 
+0

私はQtMockフレームワークをしようとしましたが、VS2010でQt 4.8を使って模擬QNAMをビルドしようとしなかったので(彼らは昨晩戻ってきました)近いうちにこの部分がQtとマージされます。しかし、私はあなたのアプローチでこれを行うのに最適で、別の方法ではatmはありません。ありがとうございます – chikuba

+0

私は助けることができてうれしい! –

+0

QNAMのpostメソッドが仮想でない場合、どのように動作しますか?あなたがMyNAMを手渡したとき、オリジナルの投稿メソッドはまだ呼び出されます。 – philk

0

あなたのクラスをテンプレートにしてから、その方法をオーバーライドすることをお勧めします...もちろん、あなたはQ_OBJECTを実装しているので、できません。プリプロセッサのものは動作しません。

複数の抽象レイヤーを使用する必要があります。あなたのQ_OBJECTに非シグナルのものを実装する基本クラスと、QNetworkAccessの中で使う必要がある最小限のインターフェースを提供する基本クラス。次に、必要なものを仮想化することができ、テストバージョンと/または/両方のQtバージョンを作成できます。

作成したQNetworkの基本ベースをboost :: signalsなどのC++と互換性のあるものに変換する場合、Q_OBJECTのベースを実装する必要はありません。

幸運。あなたがC++でできることを期待していることをQtにやろうとする試みは、髪を失う経験です。質問のコメントから

+0

ほとんどの呼び出しで使用されて以来、私は本当にqnam部分を分離できません。あなたが何を意味するかわからないあなたは何らかの種類の例を提供できますか? – chikuba

関連する問題