2016-06-12 1 views
0

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

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

Так что я явно нужно создать экземпляр bob где-то (Ex: bob bob; ... Я Бесполезный 't выбрать имена), но я просто не могу понять, где это сделать. Рамка тестирования Boost обеспечивает собственную функцию main (что означает, что я не предоставляю ее), поэтому я не могу ее там делать, и я ожидал, что Boost будет создавать экземпляр самого объекта, но это не похоже. Я пробовал вставить bob bob; в bob_test.cpp и bob.cpp, что привело к такой же ошибке. Мой вопрос: где я должен создать экземпляр объекта bob, который можно использовать в bob_test.cpp? Будучи C++ noob, моя кишка говорит, что это должно быть в 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()); 
} 
+0

Это не ответ на вопрос, но я нашел обходной путь, где я использую пространство имен боб {} вместо класса боб, в обоих bob.h и bob.cpp файлах. – Totem

+0

Еще лучше обходной путь, хотя и не совсем ответ, объявляет статический метод класса. Таким образом, мне не нужно создавать объект, и это позволило мне продолжить тестирование. – Totem

ответ

0

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

bob mybob; 
mybob.hey(); 

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

+0

Я знаю, что объект требуется, но мой вопрос заключается в том, чтобы экземпляр bob был создан. Например, у меня нет основной функции для этого. Я знаю, что это C++, а не Boost, у которого есть проблема, но это потому, что я использую Boost, что у меня проблема. – Totem

+0

См. Тестовую реализацию любой библиотеки Boost. Это хороший источник, охватывающий почти каждый случай, который можно себе представить. Каталог Libs под boost. – Frank

2

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

#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() 
+0

Спасибо, я посмотрю на это. Дело в том, что я не пишу тестовые примеры, и они не настроены на использование светильников (плюс я не должен их редактировать). Я могу только предположить, что есть какой-то способ для тестового файла получить доступ к объекту bob из экземпляра мной в одном из других файлов (bob.cpp или bob.h), иначе все это было настроено неправильно ... – Totem

Смежные вопросы