这个问题的解决方案是编写一个自定义谓词来执行检查并BOOST_REQUIRE(custom_predicate(args))在不同的测试用例中使用。自定义谓词可以采用您想要的任何参数并返回boost::test_tools::predicate_result,这是一种与 Boost.Test 中的断言宏兼容的类型,您可以在失败期间在其中构建详细的诊断消息。
要使用您的示例:
using namespace boost::test_tools;
predicate_result checkStringStandards(String& s, size_t length, const char* text) {
predicate_result result{true};
if (s.length() != length) {
result = false;
result.message() << "\nString " << s
<< " differs in length; expected: "
<< length << ", actual: " << s.length();
}
...
return result;
}
BOOST_AUTO_TEST_CASE(String_construct){
String s1;
BOOST_REQUIRE(checkStringStandards(s1, 0, ""));
String s2("normal char");
BOOST_REQUIRE(checkStringStandards(s2, 11, "normal char"));
}
\n消息开头的奇怪之处在于,当打印诊断时,带有“字符串...长度不同”的文本将在它自己的行上发出。如果谓词失败,它会将其失败冒泡到BOOST_REQUIRE这将触发测试失败并在调用行BOOST_REQUIRE而不是在您的自定义谓词中报告失败。
还有另一种更糟糕的替代方案,它也可以通过将您的自定义断言作为巨大的 megamacros 来实现相同的结果,但我发现这太可怕了,我什至不打算展示如何做到这一点的示例 :)。