C ++ Boost.Test - 应该在哪里创建类对象来测试它的方法?

时间:2016-06-12 14:37:16

标签: c++ unit-testing boost boost.test

我正在使用Boost来测试代码的exercism.io C ++挑战。我有3个文件,bob.cppbob.hbob_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.cppbob.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 个答案:

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