【发布时间】:2016-06-12 14:37:15
【问题描述】:
我正在做使用 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_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