【问题标题】:C++ Boost.Test - Where should class object be created to test it's method?C++ Boost.Test - 应该在哪里创建类对象来测试它的方法?
【发布时间】:2016-06-12 14:37:15
【问题描述】:

我正在做使用 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_test.cpp 中使用的bob 对象?作为一个 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());
}

【问题讨论】:

  • 这不是问题的答案,但我找到了一种解决方法,我在 bob.h 和 bob.cpp 文件中都使用命名空间 bob{} 而不是类 bob。
  • 一个更好的解决方法,虽然仍然不是完全正确的答案,但是声明类方法是静态的。这样我就不需要创建一个对象,这让我可以继续进行测试。

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


【解决方案1】:

您可以使用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()

【讨论】:

  • 谢谢,我会看看这个。问题是,我没有编写测试用例,它们也没有设置为使用固定装置(另外我不应该编辑它们)。我只能假设测试文件有某种方法可以从我的实例中访问一个 bob 对象,在其他文件之一(bob.cpp 或 bob.h)中,或者整个事情已经设置好了错误地被exercism.io...
【解决方案2】:

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

bob mybob;
mybob.hey();

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

【讨论】:

  • 我知道需要一个对象,但我的问题是应该在哪里实例化 bob 的实例。例如,我没有执行此操作的主要功能。我知道是 C++ 而不是 Boost 有问题,但正是因为我使用的是 Boost,所以我遇到了问题。
  • 查看任何 Boost 库的测试实现。这些是一个很好的来源,几乎涵盖了人们可以想象的所有情况。 boost下的libs目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2012-08-24
  • 2015-11-09
相关资源
最近更新 更多