5

私はこれを持っています(実際にはそうではありませんが、単なる例です):

template<class T> 
T foo() {...}

関数の結果の型を確認する必要があります (ここでは意味がありません。私の例はもっと複雑です)、Google のテスト/モックはこの種のアサーションをサポートしていますか?

A< T > で EXPECT_THAT を試してみましたが、うまくいきません。

ありがとう。

4

2 に答える 2

4

Google Test はランタイム テスト用です。関数の型は、コンパイル時に、Google Test が全体像に入る前に決定されます。

result_of次のように、typeid 値が同じであることを使用してアサートできます。

EXPECT_EQ(typeid(int), typeid(std::result_of<foo<int>() >::type));

もう 1 つのオプションは、戻り値の型の明示的なテストを控えて、使用されると予想されるとおりに関数を使用することです。戻り値の型に問題がある場合は、テストを実行する前にコンパイラが通知します。とにかく、特定の戻り値の型を 1 つ要求するよりは、おそらくそのほうがよいでしょう。longたとえば、戻り値の型が期待された ではなく であることが判明した場合intでも、他のすべてのテストに合格した場合int、そもそも本当に重要でしたか?

于 2011-08-12T21:02:06.377 に答える
3

::testing::StaticAssertTypeEq();を使用できます。std::result_ofで。型付きテストも使用できます。完全な例:

#include <type_traits>
template<class T>
T foo(int) {...}

///Boilerplate code for using several types
template <typename T>
class ResultTest : public testing::Test {}
typedef ::testing::Types<float, double, int, char*, float**> MyTypes; //Types tested!
TYPED_TEST_CASE(ResultTest , MyTypes);

///Real test
TYPED_TEST(ResultTest , ResultTypeComprobation) {
    //It will be checked at compile-time. 
    ::testing::StaticAssertTypeEq<TypeParam, std::result_of(foo<TypeParam>)>(); 
}

ただし、テストはインスタンス化され、何もせずに実行時に実行されます。奇妙ですが、これ以上のものは見つかりませんでした。

于 2013-08-20T10:00:21.000 に答える