【问题标题】:Google Test macros seem not to work with Lambda functions谷歌测试宏似乎不适用于 Lambda 函数
【发布时间】:2017-06-09 14:07:15
【问题描述】:

所以,我有以下代码。不管 Interpolator 类的细节是什么,在这种情况下它都应该不会抛出异常,这就是我想要测试的。

TEST(errorhandlingInterpolator, toolargeInput) {

    const size_t numSamples = 100000;

    std::array<double, numSamples> bf{{0.0, 0.5, 1.0, 0.0, 0.5, 0.0}};
    std::array<double, numSamples> ts{{0.0, 0.0, 0.0, 0.5, 0.5, 1.0}};
    std::array<double, numSamples> current{ {0.13, 0.83, 0.96, 0.22, 0.30, 0.54} };

    ASSERT_NO_THROW( [&](){
        Interpolator<double, double, double, numSamples> intp(bf, ts, current);
    });

}

不幸的是,我收到以下错误(有或没有 lambda 函数)。在之前遇到相同的错误后,我将构造函数调用包装在 lambda 中。

.../test/main.cpp:34: error: macro "ASSERT_NO_THROW" passed 4 arguments, but takes just 1
 });
  ^

这不是一个破坏交易的问题。我可以将我的代码包装在一个“普通”函数中,然后它本身可以返回 AssertionSuccess() 或 AssertionFailure(),然后可以在断言中进行检查,但这似乎不是很好。

根据我对 CATCH 测试框架的经验,我可以在宏中直接使用 REQUIRE_NOTHROW() 从构造函数测试异常。甚至 lambda 也是不必要的。

如果我在使用 google 测试框架时没有犯错,我会感到惊讶。

我查看了以下两个文档来寻找解决我的问题的方法,但似乎没有参考。

https://github.com/google/googletest/blob/master/googletest/docs/advanced.md

https://github.com/google/googletest/blob/master/googletest/docs/primer.md

【问题讨论】:

  • Highly related,潜在的骗子。 Tl;dr:将其包裹在另一组括号中。
  • 哎呀!确实!但谷歌没有出现这个问题! :D
  • 好的,用括号括起来的 lambda 构造函数可以工作。 :P
  • 只是为了完整,如果我删除 lambda 并添加括号,它也不会编译。

标签: c++ lambda macros googletest


【解决方案1】:

当宏参数中有逗号时会发生这种情况 - 预处理器在逗号上获取“第一个 dibs”并将它们解释为参数分隔符。

解决方案是在参数周围添加一对括号。

【讨论】:

  • 好的。这有效,但仅在特定情况下有效。 GoogleTest Framework 似乎真的不适用于 lambda 函数。我试过这个 ASSERT_ANY_THROW([](){throw;}); ,并且没有注册异常。然后我尝试了, ASSERT_ANY_THROW(([](){throw;})); (请参阅额外的括号)并且再次没有注册异常。但是,如果我有一个“正常”函数抛出异常,那么上面的断言可以很好地注册它。但我觉得很奇怪,像 GoogleTest 框架这样被广泛使用和吹捧的东西不支持这样的 lambda 函数。
  • @JoeyMallone 该函数不会抛出,除非你调用它。
  • 我正在调用它。我在 TEST() 中有它,如果我只将那一行从 lambda 函数切换到“正常”函数,则会注册异常。 void dummy() {throw;} ASSERT_ANY_THROW(dummy());我怎么会不叫它?
  • 让我再问一个问题,这样我可以清楚地发布代码。
  • @JoeyMallone [](){throw;} 只定义了函数。 [](){throw;}() 会调用它。
猜你喜欢
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2011-01-09
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多