我正在寻找一种使用 Catch 测试模板类的好方法。我有一些几乎可以工作的东西:
#define RUN_ALL(fn, params) \
fn<uint8_t, bool>(params); \
fn<uint8_t, char>(params); \
fn<uint16_t, bool>(params); \
fn<uint16_t, char>(params); \
fn<uint32_t, bool>(params); \
fn<uint32_t, char>(params); \
fn<uint64_t, bool>(params); \
fn<uint64_t, char>(params);
template<typename A, typename B>
void test_number_one() {
REQUIRE(...)
}
TEST_CASE("Foo::Foo() works nicely", "[SmallGraph]") {
RUN_ALL(test_number_one)
}
此设置将仅在第一次失败之前运行,这很好,因为所有 8 个案例很可能都会以相同的方式失败。但是,最好知道发生故障时使用了哪组模板参数。我的想法是这样做:
#define RUN_ALL_P(fn, params) \
INFO("Testing <uint8_t, bool>"); \
fn<uint8_t, bool>(params); \
INFO("Testing <uint8_t, char>"); \
fn<uint8_t, char>(params); \
INFO("Testing <uint16_t, bool>"); \
fn<uint16_t, bool>(params); \
...
但是,我不能在 RUN_ALL 中使用多个 INFO,因为这样做会生成带有重复标识符的代码。
FOO.cpp:270:3: error: redefinition of 'scopedMessage270'
RUN_ALL(test_number_one);
(RUN_ALL(test_number_one)
出现在第 270 行。)
关于不需要所有测试功能都具有相同签名的解决方法的任何想法?
(我也欢迎有关使用 CATCH 测试模板代码的文章的指针,以及有关如何搜索此类文章而不会获得一堆关于一般异常处理的结果的建议——即 try/catch。)