4

我正在尝试从具有构造函数声明(带参数)的普通类创建一个测试夹具类,如下所示:

你好.h

class hello
{
public:
hello(const uint32_t argID, const uint8_t argCommand);
virtual ~hello();
void initialize();
};

其中 uint32_t 是:typedef unsigned int而 uint8_t 是:typedef unsigned char

我的测试夹具类:

你好TestFixture.h

class helloTestFixture:public testing::Test
{
public:
helloTestFixture(/*How to carry out the constructor declaration in this test fixture class corresponding to the above class?*/);
virtual ~helloTestFixture();
hello m_object;
    };
TEST_F(helloTestFixture, InitializeCheck) // Test to access the 'intialize' function
{
m_object.initialize();
}

尝试实现上述代码后,它给了我错误:

 Error C2512: no appropriate default constructor available

我试图将 hello.h 文件中构造的构造函数复制我的hellotestfixture.h文件中。这样做有什么办法吗?我已经尝试以多种方式实现它,但到目前为止还没有成功。关于如何实现这一点的任何建议?

4

2 回答 2

3

这个错误告诉你你没有在helloTestFixture类中提供默认构造函数,TEST_F宏需要它来创建你的类的对象。

您应该使用part-of关系而不是is-a。创建hello您需要的类的所有对象,以便测试您需要的所有各个方面。

我不是谷歌测试专家。但是,在此处浏览文档:

https://github.com/google/googletest/blob/master/googletest/docs/primer.md#test-fixtures-using-the-same-data-configuration-for-multiple-tests

https://github.com/google/googletest/blob/master/googletest/docs/faq.md#should-i-use-the-constructordestructor-of-the-test-fixture-or-setupteardown

似乎该SetUp方法是首选。如果你的目标是测试 class hello,你可以这样写:

#include <memory>

#include "hello.h"
#include "gtest.h"

class TestHello: public testing::Test {
public:
    virtual void SetUp()
    {
        obj1.reset( new hello( /* your args here */ ) );
        obj2.reset( new hello( /* your args here */ ) );
    }

    std::auto_ptr<hello> obj1;
    std::auto_ptr<hello> obj2;
};

TEST_F(QueueTest, MyTestsOverHello) {
    EXPECT_EQ( 0, obj1->... );
    ASSERT_TRUE( obj2->... != NULL);
}

auto_ptr并不是真正需要的,但它会节省您编写TearDown函数的工作量,并且它还会在出现问题时删除对象。

希望这可以帮助。

于 2011-12-01T17:11:58.673 回答
2

经过不多的代码更正,这就是我为您准备的东西:答案:)

class hello
{
public:
  hello(const uint32_t argID, const uint8_t argCommand);
virtual ~hello();
void initialize();
};

hello::hello(const uint32_t argID, const uint8_t argCommand){/* do nothing*/}
hello::~hello(){/* do nothing*/}
void hello::initialize(){/* do nothing*/}

class helloTestFixture
{
public:
  helloTestFixture();
  virtual ~helloTestFixture();
  hello m_object;
};

helloTestFixture::helloTestFixture():m_object(0,0){/* do nothing */}
helloTestFixture::~helloTestFixture(){/* do nothing */}

int main()
{
    helloTestFixture htf;
    htf.m_object.initialize();
}

这编译和运行良好,希望这能回答你的问题。:)

于 2011-12-02T12:00:31.987 回答