我有这个(不是真的,只是一个简单的例子):
template<class T>
T foo() {...}
我需要检查函数的结果类型(这里没有任何意义,我保证我的例子更复杂),谷歌测试/模拟是否支持这种断言?
我尝试使用 A<T> 的 EXPECT_THAT,但我无法做到这一点。
谢谢。
我有这个(不是真的,只是一个简单的例子):
template<class T>
T foo() {...}
我需要检查函数的结果类型(这里没有任何意义,我保证我的例子更复杂),谷歌测试/模拟是否支持这种断言?
我尝试使用 A<T> 的 EXPECT_THAT,但我无法做到这一点。
谢谢。
Google Test 用于运行时测试。函数的类型是在编译时确定的,在 Google Test 进入图片之前。
您可以使用result_of
并断言 typeid 值是相同的,如下所示:
EXPECT_EQ(typeid(int), typeid(std::result_of<foo<int>() >::type));
另一种选择是放弃对返回类型的显式测试,只使用预期使用的函数。如果返回类型有问题,编译器会在你尝试运行测试之前告诉你。无论如何,这可能比要求一种特定的返回类型要好;例如,如果返回类型long
不是预期的int
,但所有其他测试仍然通过,那么一开始int
真的那么重要吗?
您可以使用::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>)>();
}
但是,测试将被实例化并在运行时运行而不做任何事情。奇怪,但我找不到更好的东西。