如何获取gtest TYPED_TEST参数类型
How to get gtest TYPED_TEST parameter type
我在 Windows(Visual Studio 2017)上写了一些单元测试,我需要将它们移植到 Linux(GCC 4.9.2 - 我坚持使用这个版本...)。我为我的问题提供了一个简单的例子,它在 Windows 上编译得很好(我认为它不应该编译,因为 MyParamType
是来自 e 模板基础 class 的依赖类型)和不在 Linux.
上编译
示例:
#include <gtest/gtest.h>
template<typename T>
struct MyTest : public testing::Test
{
using MyParamType = T;
};
using MyTypes = testing::Types<int, float>;
TYPED_TEST_CASE(MyTest, MyTypes);
TYPED_TEST(MyTest, MyTestName)
{
MyParamType param;
}
In member function ‘virtual void
MyTest_MyTestName_Test::TestBody()’:error: ‘MyParamType’ was not declared in this scope
MyParamType param;
通过更改为:
TYPED_TEST(MyTest, MyTestName)
{
typename MyTest<gtest_TypeParam_>::MyParamType param;
}
代码可以编译,但是看起来很丑。
是否有 easy/nice 方法从 TYPED_TEST
获取模板参数类型?
答案隐藏在文档中:
#include <gtest/gtest.h>
template<typename T>
struct MyTest : public testing::Test
{
using MyParamType = T;
};
using MyTypes = testing::Types<int, float>;
TYPED_TEST_CASE(MyTest, MyTypes);
TYPED_TEST(MyTest, MyTestName)
{
// To refer to typedefs in the fixture, add the 'typename TestFixture::'
// prefix. The 'typename' is required to satisfy the compiler.
using MyParamType = typename TestFixture::MyParamType;
}
https://github.com/google/googletest/blob/master/googletest/docs/advanced.md
我在 Windows(Visual Studio 2017)上写了一些单元测试,我需要将它们移植到 Linux(GCC 4.9.2 - 我坚持使用这个版本...)。我为我的问题提供了一个简单的例子,它在 Windows 上编译得很好(我认为它不应该编译,因为 MyParamType
是来自 e 模板基础 class 的依赖类型)和不在 Linux.
示例:
#include <gtest/gtest.h>
template<typename T>
struct MyTest : public testing::Test
{
using MyParamType = T;
};
using MyTypes = testing::Types<int, float>;
TYPED_TEST_CASE(MyTest, MyTypes);
TYPED_TEST(MyTest, MyTestName)
{
MyParamType param;
}
In member function ‘virtual void MyTest_MyTestName_Test::TestBody()’:error: ‘MyParamType’ was not declared in this scope MyParamType param;
通过更改为:
TYPED_TEST(MyTest, MyTestName)
{
typename MyTest<gtest_TypeParam_>::MyParamType param;
}
代码可以编译,但是看起来很丑。
是否有 easy/nice 方法从 TYPED_TEST
获取模板参数类型?
答案隐藏在文档中:
#include <gtest/gtest.h>
template<typename T>
struct MyTest : public testing::Test
{
using MyParamType = T;
};
using MyTypes = testing::Types<int, float>;
TYPED_TEST_CASE(MyTest, MyTypes);
TYPED_TEST(MyTest, MyTestName)
{
// To refer to typedefs in the fixture, add the 'typename TestFixture::'
// prefix. The 'typename' is required to satisfy the compiler.
using MyParamType = typename TestFixture::MyParamType;
}
https://github.com/google/googletest/blob/master/googletest/docs/advanced.md