GTest 类型测试 - 使用

GTest Typed Test - Using

我想在下面的 'DoesBlah' 测试中使用基础 class 的 'MyType'。

#include <gtest/gtest.h>

template <typename T>
struct MemberVariable
{
    T m_t;
};

struct Base : public ::testing::Test
{
    template <typename MemberType>
    using MyType = MemberVariable<MemberType>;
};

template <typename DerivedType>
struct Derived : public Base
{
};

typedef ::testing::Types<int, char> MyTypes;
TYPED_TEST_CASE(Derived, MyTypes);

TYPED_TEST(Derived, DoesBlah)
{
    MyType<TypeParam> test;
    test.m_t = (TypeParam)1;
    ASSERT_EQ(test.m_t, 1);
}

但是,我得到以下编译错误:

gti/specific/level/Test.t.cpp: In member function 'virtual void Derived_DoesBlah_Test<gtest_TypeParam_>::TestBody()':
gti/specific/level/Test.t.cpp:25:5: error: 'MyType' was not declared in this scope
     MyType<TypeParam> test;

我尝试使用 TestFixture::MyType、typename TestFixture::MyType,但两者均无效。

我怎样才能让 Derived 识别出叫做 'MyType' 的东西?

通过一些简化,宏 TYPED_TEST(Derived, DoesBlah) 扩展为:

template <typename TypeParam>
class Derived_DoesBlah_Test : public Derived<TypeParam>
{
private:
    typedef Derived<TypeParam> TestFixture;
    virtual void TestBody();
};
template <typename TypeParam>
void Derived_DoesBlah_Test<TypeParam>::TestBody()

所以后面的 {} 块是模板 class 派生自 Derived<TypeParam> 成员的函数定义。 TestFixturetypedef是可用的,但是它依赖于模板参数TypeParam,所以它被认为是依赖类型。更重要的是,您想要访问该依赖类型的模板成员。所以你需要 typenametemplate 关键字:

{
    typename TestFixture::template MyType<TypeParam> test;
    test.m_t = (TypeParam)1;
    ASSERT_EQ(test.m_t, 1);
}

有关依赖类型以及在声明和表达式中使用 typenametemplate 关键字的更多信息,请参阅 this SO question