【问题标题】:GoogleTest Framework seems not to work with Lambda functions (follow up)GoogleTest Framework 似乎不适用于 Lambda 函数(跟进)
【发布时间】:2017-06-12 10:25:34
【问题描述】:

这是我上一个问题的后续:

Google Test macros seem not to work with Lambda functions

该案例中提到的解决方案适用于该特定案例,即 lambda 内的模板类的构造函数可以用括号括起来,并且构建会成功。我接受了这个答案。但问题仍然存在,GoogleTest 框架似乎不适用于 Lambda 函数。我在文档中对此一无所知。

我做了以下测试,

TEST(errorhandlingInterpolator, NOTtoolargeInput) {
    ASSERT_NO_THROW(throw);
}

这会导致测试失败。很好。

然后,我做到了,

TEST(errorhandlingInterpolator, NOTtoolargeInput) {
        ASSERT_NO_THROW([](){throw;});
}

这将导致测试不失败。奇怪的。

所以,最后为了彻底了解(一些如此琐碎的事情),我测试了以下一点。

void dummy() { throw; }

TEST(errorhandlingInterpolator, NOTtoolargeInput) {
        ASSERT_NO_THROW(throw);
}

异常导致测试失败。都很好。

这在我的脑海中引发了一个标志,异常甚至可以与 lambda 函数一起使用。我认为它们就像普通函数一样,除了匿名。显然他们这样做了。下面的两个问题就是讲这个的。

Can C++ lambda-expression throw?

throw an exception from a lambda expression, bad habit?

所以,这似乎归结为谷歌测试框架中的宏不适用于 lambda 函数。

【问题讨论】:

    标签: c++ c++11 exception lambda googletest


    【解决方案1】:

    ASSERT_NO_THROW([](){throw;}) 中的表达式不执行异常,它只是声明了一个 lambda,然后将其丢弃,因为它没有分配给任何东西。

    你想要ASSERT_NO_THROW([](){throw;}()),它会立即尝试执行 lambda。

    【讨论】:

    • 我想哭。我对我的 lambda 表达式不够了解,我开始为一些不相关的事情大喊大叫。 :'(
    • 是的!似乎是合法的。这就是问题所在。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2013-04-23
    • 1970-01-01
    • 2020-04-04
    • 2023-04-06
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多