Я уже улучшил свою среду googletest для обработки нескольких типов Qt, таких как QString (подробнее см. этот вопрос ).
inline void PrintTo(const QString& str, ::std::ostream* os)
{
*os << "<" << qUtf8Printable(str) << ">";
}
Это прекрасно работает для большинстваМакросы gtest, такие как EXPECT_EQ
и т. д.
Однако, когда я пытаюсь напрямую передать QString, например, в макрос ADD_FAILURE()
, компилятор жалуется ...
//...
ADD_FAILURE() << QString("Test!");
//...
gtest-message.h(131): error C2679: Binary Operator "<<": Could not find an operator that accepts "const QString" (...)
Есть ли способулучшите мой тест, чтобы иметь возможность напрямую использовать QStrings
, или нет способа избежать включения этих QStrings
в qUtf8Printable()
?
Для уточнения:
Запись ADD_FAILURE() << qUtf8Printable(QString("Test!"));
работает, какADD_FAILURE() << QString("Test!").toStdString();
.
Но было бы намного лучше, если бы можно было избежать этих явных преобразований / вызовов, например, включив ADD_FAILURE()
для прямой обработки QString
.(Дублирование кода плохое - даже если это только один дополнительный короткий вызов функции для записи каждый раз, вы можете ожидать повторения конструкции для тысяч тестов ...)
Вот выдержка из необработанного (непереведенного) сообщения об ошибке (все сообщение об ошибке состоит из 132 строк, перечисляющих, с чем компилятор не может сопоставить функцию)
2>c:\development\external\googletest\include\gtest\gtest-message.h(131): error C2679: Binärer Operator "<<": Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ "const QString" akzeptiert (oder keine geeignete Konvertierung möglich)
2> c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(495): note: kann "std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_streambuf<char,std::char_traits<char>> *)"
2> c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(475): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(const void *)"
2> c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(455): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long double)" sein
... **(snip)** ...
2> c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(981): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>,T>(std::basic_ostream<char,std::char_traits<char>> &&,const _Ty &)"
2> with
2> [
2> T=QString,
2> _Ty=QString
2> ]
2> c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(1019): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const std::error_code &)"
2> c:\development\external\googletest\include\gtest\gtest-message.h(131): note: bei Anpassung der Argumentliste "(std::stringstream, const QString)"
2> c:\development\test\src\codetest.cpp(390): note: Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "testing::Message &testing::Message::operator <<<QString>(const T &)".
2> with
2> [
2> T=QString
2> ]