0

我正在做使用 Boost 来测试代码的 exercism.io C++ 挑战。我有 3 个文件,bob.cppbob.hbob_test.cpp(都在下面)。没有课程,我可以让测试运行良好。但是一旦我需要测试一个类方法,比如bob_test.cpp尝试测试的 in ,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,但我也很有信心我不应该编辑那个文件。

鲍勃.cpp

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

using namespace std;


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

鲍勃.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());
}
4

2 回答 2

2

您可以使用 aboost::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()
于 2016-06-12T15:20:00.757 回答
0

hey是一个非静态成员函数,您正试图将其用作静态成员函数。您需要创建一个对象。这是 C++ 对你的抱怨,而不是 Boost。

bob mybob;
mybob.hey();

你也可以这样做:bob().hey()

于 2016-06-12T14:58:07.230 回答