2

少し問題があります。私は現在、テストしたい巨大なプロジェクトを持っています。ほとんどの場合、QNetworkAccessManagerが実際に呼び出しにどのように応答するかに完全に依存しています。手動で座ってイーサネットコードを抜くだけでは結果が出ないので、偽のQNAMを作りたいと思います。通常、私はクラスが派生するのと同じインターフェイスを導き出し、それを使用しているオブジェクトにベースクラスポインタを指定して、偽物と正しいものの両方をあまり労力をかけずに処理できるようにします。

 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つの異なるオブジェクトなど)。これを実際に解決するにはどうすればよいですか?

要求されたブランチ変更QtMockを確認しましたが、ドキュメントが不足しているため、起動して実行することができませんでした。

また、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を使用してRESTリクエストを実行し、終了したかどうかを確認します。

では、あまり変更せずにこのコードに挿入できる偽のQNAMをどのように実行できるでしょうか。これを解決できる素晴らしいデザインパターンや何かがありますか?

4

2 に答える 2

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);
  }
}
于 2012-05-08T00:17:47.393 に答える
0

クラスをテンプレートにして、その方法でオーバーライドできるようにすることを提案するつもりでしたが、もちろん Q_OBJECT を実装しているので、できません。プリプロセッサのものも機能しません。

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

Qt シグナルを boost::signals などの C++ と互換性のあるものに変換する QNetwork のようなベースを作成すると、Q_OBJECT のベースを実装しなくても済む場合があります。

幸運を。C++ でできると期待することを Qt で実行させようとすると、頭が痛くなります。

于 2012-05-07T23:57:57.123 に答える