Google Test - ошибка объявления конструктора

Я пытаюсь создать класс тестовых приспособлений из обычного класса с объявлением конструктора (с аргументами), как показано ниже:

привет.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

Мой класс тестовых приспособлений:

helloTestFixture.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. Любой способ сделать это? Я пытался реализовать его разными способами, но пока безуспешно. Любые предложения о том, как это реализовать?


person Emulator    schedule 01.12.2011    source источник
comment
Можете ли вы объяснить, для чего используется класс hello? Этот класс тестируется? Я думаю так. Можете ли вы написать код, показывающий, как вы хотели бы использовать класс helloTestFixture для тестирования hello?   -  person Baltasarq    schedule 02.12.2011
comment
Да, hello — это тестируемый класс, а helloTestFixture — его класс TestFixture. Проблема, с которой я сталкиваюсь здесь, заключается в том, что я не могу инициализировать конструктор в классе Fixture так, как это делается в реальном классе, и это как раз мой главный вопрос. Я добавлю тест, чтобы показать, как я собираюсь получить доступ к классу hello через helloTestFixture.   -  person Emulator    schedule 02.12.2011
comment
Но, @Emulator, в том-то и проблема: вы не можете предоставить конструктору параметры, если планируете использовать TEST_F. Ошибка компиляции связана с классом helloTestFixture, у которого нет конструктора по умолчанию, а это то, что нужно макросу TEST_F для создания объекта. Если подумать, TEST_F не может создать объект вашего класса, если конструктор не дефолтный (он не может знать, какие параметры передавать). Я думаю, вам следует подойти к проблеме создания объектов, необходимых внутри класса helloTestFixtureClass, как показано в моем ответе.   -  person Baltasarq    schedule 02.12.2011


Ответы (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();
}

Это компилируется и работает хорошо, и надеюсь, что это ответит на ваш вопрос. :)

person Neophile    schedule 02.12.2011

Эта ошибка говорит вам, что вы не предоставляете конструктор по умолчанию в классе helloTestFixture, необходимый макросу TEST_F для создания объекта вашего класса.

Вы должны использовать отношение часть вместо отношения is-a. Создайте все объекты класса hello, которые вам нужны, чтобы протестировать все различные аспекты, которые вам нужны.

Я не эксперт в Google Test. Тем не менее, просматривая документацию здесь:

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 предпочтительнее. Если ваша цель — протестировать класс 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, а также удалит объект, если что-то пойдет не так.

Надеюсь это поможет.

person Baltasarq    schedule 01.12.2011
comment
Пробовал. Так не работает. Спасибо за ваш вклад. - person Emulator; 02.12.2011
comment
Я добавляю комментарий к вашему вопросу. Тогда я совершенно уверен, что не понимаю самого вопроса. - person Baltasarq; 02.12.2011