値のパラメーター化されたテストは、型情報を渡すためには機能しません。これは、型付きまたは型パラメーター化されたテストでのみ実行できます。どちらの場合も、タイプと文字列の情報を特別な構造にパッケージ化する必要があります。タイプパラメータ化されたテストでそれを行う方法は次のとおりです。
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);
そして今、あなたはパラメータ構造を定義し、それらのテストをインスタンス化する必要があります:
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);
マクロを使用して、パラメータータイプの定義を簡略化できます。
#define MY_PARAM_TYPE(name, type, string) \
struct name { \
typedef type Type; \
static const char kStringValue = string; \
}; \
const char* name::kStringValue
次に、パラメータ構造体の定義がはるかに短くなります。
MY_PARAM_TYPE(TypeAndString1, Type1, "my string 1");
MY_PARAM_TYPE(TypeAndString2, Type2, "my string 2");
これは非常に複雑ですが、これを行う簡単な方法はありません。私の最善のアドバイスは、タイプと値の両方の情報を必要としないように、テストをリファクタリングしてみることです。しかし、必要な場合は、ここに方法があります。