我正在使用Boost来测试代码的exercism.io C ++挑战。我有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
(例如: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());
}
答案 0 :(得分:2)
您可以使用boost::test fixture
创建类bob
的实例,然后在单独的测试用例中测试bob's
函数,请参阅:Fixture models。 E.g:
#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()
答案 1 :(得分:0)
hey
是一个非静态成员函数,您尝试将其用作静态函数。您需要创建一个对象。这是C ++对你的婊子,而不是Boost。
bob mybob;
mybob.hey();
你也可以这样做:bob().hey()