gpt4 book ai didi

c++ - gtest 类型参数化的多态性

转载 作者:行者123 更新时间:2023-11-30 02:29:58 27 4
gpt4 key购买 nike

我正在尝试使用 gtest 类型参数化来确保我的类的基本功能。但是我被困在测试设置中。以下是示例:

我有两个名为 CatTest 和 DogTest 的类,以及一个名为 AnimalTest 的基类,它将测试 Cat 和 Dog 的所有相似性:

template <typename T>
class AnimalTest : public ::testing::Test
{
public:
virtual void SetUp()
{
// Do something here so that it will call the correct setup
}
};

TYPED_TEST_P( AnimalTest , HasLegs )
{
ASSERT_EQ( 4, this->Legs );
}

REGISTER_TYPED_TEST_CASE_P( AnimalTest , HasLegs );

现在在我的 CatTest.cpp 中,我声明了以下宏(DogTest 也是如此)

typedef ::testing::Types< Cat > AnimalsTypes;

INSTANTIATE_TYPED_TEST_CASE_P( CatTest, AnimalTest , AnimalsTypes );

class CatTest : public CatSetUp
, public AnimalTest< AnimalsTypes >
{
public:
virtual void SetUp()
{
CatSetUp::SetUp();
}
}

在正常的类型参数化测试示例中,HasLegs 测试将针对 Cat 和 Dog 类型运行。这里的问题是 CatTest 有自己的 SetUp(),DogTest() 也有。需要执行这些以初始化 Cat 对象,以便我可以将其传递给类型参数化测试 (Animal test)。然而,这些 SetUp 从未被调用过,事实上,甚至 DogTest() 或 CatTest() 的构造函数也从未被调用过。我认为类型参数化测试将使用重写的 SetUp() 调用派生类的相应实例?还是我在这里遗漏了什么?

最佳答案

您不得将测试类作为被测对象。

我的意思是被测对象应该是你的测试类的成员(聚合,而不是继承)——然后一切都变得简单了:

template <typename T>
class AnimalTest : public ::testing::Test
{
public:
T objectUnderTest; // animal
virtual void SetUp()
{
objectUnderTest.SetUp();
}
};

TYPED_TEST_P( AnimalTest , HasLegs )
{
ASSERT_EQ( 4, objectUnderTest.Legs );
}

REGISTER_TYPED_TEST_CASE_P( AnimalTest , HasLegs );
typedef ::testing::Types< Cat, Dog > AnimalsTypes;

INSTANTIATE_TYPED_TEST_CASE_P( AnimalWithFourLegs, AnimalTest , AnimalsTypes );

的解释

However these SetUp is never called, in fact even the constructor of DogTest() or CatTest() was never invoked.

很简单。

INSTANTIATE_TYPED_TEST_CASE_P 的第一个参数不是类名 - 它只是描述第三个参数的一些名称 - 所以你会知道哪个测试是哪个。说 INSTANTIATE_TYPED_TEST_CASE_P( CatTest, AnimalTest , AnimalsTypes ); 并不意味着它无论如何都与类 CatTest 相关...阅读 gtest-doc .

关于c++ - gtest 类型参数化的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39127901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com