Передача имени типа и строки к параметризованному тестовому использованию тест Google

Есть ли способ передать и тип и строку к параметрическому тестовому тесту Google использования.

Я хотел бы сделать:

template <typename T>
class RawTypesTest : public ::testing::TestWithParam<const char * type> {
protected:
  virtual void SetUp() {
       message = type;
  }
}; 

TEST_P(RawTypesTest, Foo) {
  ASSERT_STREQ(message, type);
  ParamType * data = ..;
  ...
}

Заранее спасибо

6
задан adk 15 July 2010 в 20:43
поделиться

1 ответ

Тесты с параметризацией значений не работают для передачи информации о типе; вы можете сделать это только с типизированными или параметризованными типами тестов.В обоих случаях вам придется упаковать информацию о типе и строке в специальные структуры. Вот как это сделать с помощью тестов с параметризацией типа :

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");

Это довольно сложно, но нет простого способа сделать это. Мой лучший совет - попробовать перефакторить ваши тесты, чтобы не требовать информацию как о типе, так и о значении. Но если нужно, вот способ.

9
ответ дан 10 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: