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()