C++ Boost.Test - Где должен быть создан объект класса для проверки его метода?

Я выполняю упражнения exercism.io C++, использующие Boost для тестирования кода. У меня есть 3 файла, bob.cpp, bob.h, а также bob_test.cpp(все ниже). Без классов я могу заставить тесты работать нормально. Но однажды мне нужно протестировать метод класса, как в bob_test.cpp, который пытается проверить bob::hey([arg])тогда я получаю ошибку:

error: cannot call member function ‘std::__cxx11::string bob::hey()’ without object

Так что мне явно нужно создать экземпляр bob где (Ex: bob bob;... я не выбрал имена) но я просто не могу понять, где это сделать. Тестовая среда Boost предоставляет свои собственные main функция (что означает, что я не предоставляю один), поэтому я не могу сделать это там, и я вроде ожидал, что Boost будет создавать экземпляр самого объекта, но это не так. Я пробовал вставлять bob bob; в bob_test.cpp а также bob.cpp в результате та же ошибка. Мой вопрос в том, где я должен создать экземпляр bob объект, который может быть использован в bob_test.cpp? Будучи нубом C++, моя интуиция говорит, что это должно быть в bob_test.cpp, но я также уверен, что не должен редактировать этот файл.

bob.cpp

#include "bob.h"
#include <iostream>
#include <string>

using namespace std;


string bob::hey() {
    return "Whatever.";
}

bob.h

#include <iostream>
#include <string>

// bob.h
class bob {

    public:

    std::string hey();

};

bob_test.cpp(просто предоставление первого теста (упрощенного), вызывающего ошибку, реальный тест немного отличается, я просто хочу, чтобы настройка работала)

#include "bob.h"
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>


BOOST_AUTO_TEST_CASE(stating_something)
{
    BOOST_REQUIRE_EQUAL("Whatever.", bob::hey());
}

2 ответа

Вы могли бы использовать boost::test fixture создать экземпляр класса bob а затем проверить bob's функции в отдельных тестовых случаях, см.: Модели приборов. Например:

#include "bob.h"
#include <boost/test/unit_test.hpp>

struct TestFixture
{
  bob bob_instance;

  TestFixture()
  : bob_instance()
  {}

  ~TestFixture() = default;
}

BOOST_FIXTURE_TEST_SUITE(TestBob, TestFixture)

BOOST_AUTO_TEST_CASE(stating_something)
{
   BOOST_REQUIRE_EQUAL("Whatever.", bob_instance.hey());
}

BOOST_AUTO_TEST_SUITE_END()

hey является нестатической функцией-членом, и вы пытаетесь использовать ее как статическую. Вам нужно создать объект. Это С ++ скулит на вас, а не на повышение.

bob mybob;
mybob.hey();

Вы также можете просто сделать это: bob().hey()

Другие вопросы по тегам