我现在正在实施一个库,用于将数据导出为具有多种设置的各种格式。我也使用Boost.Test,但似乎没有测试文件内容的功能。
出于我的目的,它应该足以检查手头的文件是否包含给定的正则表达式。我真的在寻找一个非常简单的宏,如下所示。
#define BOOST_TEST_MODULE ExportTest
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(CsvExport)
BOOST_AUTO_TEST_CASE(SimpleTest) {
//
// ... Code writes Simple.csv to harddisk
//
//
//
std::string regExpr= ... // Arbitrary regular expression
BOOST_TEST_FILE("Simple.csv", regExpr)
}
BOOST_AUTO_TEST_SUITE_END();
周围是否有扩展,可以这样使用吗?或者我必须自己写一个宏?
如果周围没有这样的宏,我怎么能无缝地赋予Boost.Test这样的功能呢?
我的最终解决方案:
最后,我在测试中包含了以下简单函数。
#include <boost/regex.hpp>
bool fileContains(const std::string& filename, const std::string& regexp) {
std::ifstream file(filename);
if (file) {
try {
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
return boost::regex_search(buffer.str(), boost::regex(regexp));
}
catch(const std::exception&) {
return false;
}
} else {
return false;
}
}
用法如下所示:
BOOST_CHECK(fileContains("Export.csv","-48.434"));
答案 0 :(得分:1)
这只是意见,但我认为在这种情况下扩展Boost.Test是不必要的。我只想编写一个函数match_in_file(fname,regex_as_string),也许只有标题,并将其包含在任何需要它的测试文件中。然后你可以写
BOOST_ASSERT(match_in_file(fname, regexpr));
在我看来,为这种情况扩展Boost将是一个过于单一的设计的例子。在您发布的示例中,您传递了一个csv文件......也许您希望您的find-in-file能够解析csv元素并在其中进行搜索...也许以后您可能会想要不巧妙地应用它们不同的规则(例如,仅在csv文件的某个列中,或在xml的某些节点中)。
如果你扩展Boost,你将获得一个庞大而笨重的界面。如果您编写了一组能够满足您需求的简单函数,那么您可以更清晰地分离责任,并提供更好的重用可能性。此外,您可能会发现这些函数属于其他地方,或者可能以干净的方式从您的其他代码中分解出来。