带有不完整模板的googletest类型参数化测试

问题描述 投票:0回答:1

假设我有一个比较模板类的两个实例的测试:

TEST_F(fooSuite, fooTest) {
    U<A> tA;
    U<B> tB;
    someCheck(tA, tB);
}

我现在想将Type-Parameterized TestU都设为V,因为它们实现了相同的接口:

template <class T>
class U { ... }

template <class T>
class V { ... }

直觉上,我想写点像:

template <class TestType>
class fooSuite { };

TYPED_TEST_P(fooSuite, fooTest) {
    TypeParam<A> tA;
    TypeParam<B> tB;
    someCheck(tA, tB);
}

REGISTER_TYPED_TEST_SUITE_P(fooSuite, fooTest);

using TypesToTest = ::testing::Types<U, V>
INSTANTIATE_TYPED_TEST_SUITE_P(fooPrefix, fooSuite, TypesToTest);

自然,由于UV在此using表达式中需要模板参数,因此无法编译。

如果没有主要的解决方法来创建包装类以进行传递,是否有可能?

c++ googletest
1个回答
0
投票

如果没有主要的解决方法来创建包装类以进行传递,是否有可能?

文档中的AFAICS,答案是:不,您不能。问题是TestingTypes具有类型,但是您想传递模板。我能看到的唯一解决方案是创建一个简单的包装器类型,将感兴趣的模板携带到测试函数中,并在其中使用所需的模板参数对其进行实例化。

免责声明:我对Google测试还不够熟悉,也许有一种方法可以做到。

但是,根据您所说的“主要变通办法”的确切含义,以下代码说明了一种可能的方法,我认为该方法应该可行。我认为这项工作还不错。

template <class T>
class U { };

template <class T>
class V {  };

class A{};
class B{};

template<template<class> typename UorV>
struct TemplateHolder {
    template<class Arg>
    using type = UorV<Arg>;
};

template<class T, class Arg>
using instantiate_t = typename T::template type<Arg>;

// Mimick what I suspect the google testing::Types and TypeParam are. 
template<class... Ts>
struct TestingTypes {};

using types_to_test = TestingTypes<TemplateHolder<U>, TemplateHolder<V>>;



int main( void ) {

    using TypeParam = TemplateHolder<U>;
    using ActualTypeToTestA = instantiate_t<TestingType, A>;
    using ActualTypeToTestB = instantiate_t<TestingType, B>;

    static_assert(std::is_same_v<ActualTypeToTestA, U<A>>);
    static_assert(std::is_same_v<ActualTypeToTestB, U<B>>);
    return 0;
}

Live code here

© www.soinside.com 2019 - 2024. All rights reserved.