我想测试 MyException
在某种情况下被抛出。 EXPECT_THROW
在这里很好。但我也想检查异常是否具有特定状态,例如 e.msg() == "Cucumber overflow"
。
这在 GTest 中如何最好地实现?
原文由 Mr. Boy 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想测试 MyException
在某种情况下被抛出。 EXPECT_THROW
在这里很好。但我也想检查异常是否具有特定状态,例如 e.msg() == "Cucumber overflow"
。
这在 GTest 中如何最好地实现?
原文由 Mr. Boy 发布,翻译遵循 CC BY-SA 4.0 许可协议
我找到了 Brandlingo( 宏解决方案)给出的原始答案,以创造比 EXPECT_THAT
替代方案更好的体验,如果您需要以非平凡的方式检查异常的内容,这仍然是有限的。
Brandlingo 的回答有一些警告,尽管我已经在这里解决了:
#define ASSERT_THROW_AND_USE(statement, expected_exception, exception_varname) \
try { \
try { \
(statement); \
FAIL() << "Expected: " #statement " throws an exception of type " #expected_exception \
".\n Actual: it throws nothing."; \
} catch (const expected_exception&) { \
throw; \
} catch (const std::exception& e) { \
FAIL() << "Expected: " #statement " throws an exception of type " #expected_exception \
".\n Actual: it throws a different type, with message: " \
<< std::quoted(e.what()); \
} \
} catch (const expected_exception& exception_varname)
然后像这样使用它:
ASSERT_THROW_AND_USE(foo(), MyException, e)
{
ASSERT_STREQ("fail message", e.MyMethod());
}
如果抛出了错误的异常,你会得到如下信息:
Failed
Expected: foo() throws an exception of type MyException.
Actual: it throws a different type, with message: "some other thing"
原文由 Bryant 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
我主要是第二个 Lilshieste 的回答,但要补充一点,您还应该验证没有抛出 错误 的异常类型: