Valore test con parametri non funzionano per il passaggio di informazioni sul tipo; puoi farlo solo con test parametrici digitati o di tipo. In entrambi i casi dovrai raggruppare il tuo tipo e le stringhe in strutture speciali. Ecco come farlo con type-parameterized tests:
template <typename T> class RawTypesTest : public testing::Test {
public:
virtual void SetUp() {
this->message_ = TypeParam::kStringValue;
}
protected:
const char* const message_;
}
TYPED_TEST_CASE_P(RawTypesTest);
TYPED_TEST_P(RawTypesTest, DoesFoo) {
ASSERT_STREQ(message, TypeParam::kStringValue);
TypeParam::Type* data = ...;
}
TYPED_TEST_P(RawTypesTest, DoesBar) { ... }
REGISTER_TYPED_TEST_CASE_P(FooTest, DoesFoo, DoesBar);
E ora si deve definire le strutture dei parametri e istanziare i test per loro:
struct TypeAndString1 {
typedef Type1 Type;
static const char* kStringValue = "my string 1";
};
const char* TypeAndString1::kStringValue;
struct TypeAndString2 {
typedef Type1 Type;
static const char* kStringValue = "my string 2";
};
const char* TypeAndString2::kStringValue;
typedef testing::Types<TypeAndString1, TypeAndString2> MyTypes;
INSTANTIATE_TYPED_TEST_CASE_P(OneAndTwo, RawTypeTest, MyTypes);
è possibile utilizzare una macro per semplificare la definizione del parametro tipi:
#define MY_PARAM_TYPE(name, type, string) \
struct name { \
typedef type Type; \
static const char kStringValue = string; \
}; \
const char* name::kStringValue
Poi definizioni di struct parametri diventano molto più breve:
MY_PARAM_TYPE(TypeAndString1, Type1, "my string 1");
MY_PARAM_TYPE(TypeAndString2, Type2, "my string 2");
Questo è piuttosto complicato ma non esiste un modo semplice per farlo. Il mio miglior consiglio è di provare a ridimensionare i test per evitare di richiedere sia informazioni di tipo che di valore. Ma se devi, ecco la strada.
è 'TestParam' una classe GTEST? –
scusa, avrebbe dovuto essere TestWithParam – adk