2017-03-04 7 views
3

私はGoogleTest(GTest)フレームワークをQt5アプリケーションと共に使用しています。GoogleTestフレームワークでQStringをきれいに印刷するには?

QString引数を使用してテストが失敗すると、フレームワークは関連するすべての値を出力しようとします。ただし、外部型(この場合はQt5のQString)を自動的に処理することはできません。

QString test = "Test"; 
ASSERT_EQ(test, "Value"); 

enter image description here

は、どのように私は(手動たびに変換することなく=)に自動的にきれいな印刷QStringsにGoogleTestを得ることができますか?

答えて

4

GoogleTestガイドでは、カスタムタイプを処理する方法を一般的にはteach the frameworkで説明しています。最後に

、次のコードスニペットは、GoogleTestがQStringsで動作することができることのために追加する必要があるのです。

QT_BEGIN_NAMESPACE 
inline void PrintTo(const QString &qString, ::std::ostream *os) 
{ 
    *os << qUtf8Printable(qString); 
} 
QT_END_NAMESPACE 

このコードは、あなたのテスト・フィクスチャの名前空間であってもよいが、必要ならない(MUST NOT) Qt名前空間(または一般的には、きれいに印刷されるべき型が定義されている名前空間)に存在する必要があります。

結果GoogleTestは今、かなり印刷物のQStrings: enter image description here

あなたはもちろん、それはQStringのから来ていることをより明確にするために、いくつかの引用符を追加することができます。

*os << "\"" << qUtf8Printable(qString) << "\""; 

ソース:Webinar ICS Qt Test-Driven Development Using Google Test and Google Mock Justin Noel著シニアコンサルティングエンジニア

+1

その他のヒント:prをご希望の場合は 'qUtf8Printable'を使用してくださいint文字列中のUnicode文字( 'qPrintable'は" local 8 bit "に変換されますが、特にWindowsではUnicodeがクリーンではないかもしれません)。 'QString'を印刷して印刷できない文字をエスケープする場合は、' QBebte'(おそらく 'QBuffer'に作用し、' QByteArray'をホストしています)に行きます。 – peppe

+1

私はこれを動作させることはできません。面白いのは、2つのPrintTo関数(1つはQString&を取り、もう1つがQStringをとる)を定義すると、コンパイルエラー 'エラーC2668: 'PrintTo'をオーバーロードされた関数へのあいまいな呼び出しが 'void PrintTo(const QString、 std :: ostream *) 'または' void PrintTo(const QString&、std :: ostream *) 'と言っていますが、もし私がちょうどそれを呼び出すようなことがないなら...魔法のソースは何ですか? – gremwell

+0

@gremwell PrintToがアプリケーションの名前空間にないことを確認しましたか?私は別として、ソースが何であるかわからない。最初のフィクスチャが同じCPPファイルで宣言される前にこれらの行を挿入するだけです(QT 5.7および最新のGoogleTest)。 –

関連する問題