C++ lambda 测试拦截器/模拟

标签 c++ unit-testing lambda

我正在寻找一种解决方案,如何创建拦截器/模拟 lambda 以便能够检查它是否被调用。我测试的是:

// test.hpp
template<typename R, typename ...Args>
std::function<R(Args&&...)> make_test_lambda(
    bool &called,
    std::function<R(Args&&...)> fn
) {
  called = false;

  return [&called, f=std::move(fn)](Args&&... args) {
    called = true;
    return f(std::forward<Args>(args)...);
  };
}

// test.cpp: test with "catch"
bool called;
function_under_test(make_test_lambda(called, [](int x) {
    REQUIRE(x == 4);
}));

REQUIRE(called);

它不起作用没有匹配的调用函数。你能帮帮我吗?

非常感谢!

最佳答案

问题是每个 lambda 都有一个只有编译器知道的唯一类型。模板参数推导发生在编译器选择候选函数时,确定可行函数集之前。粗略地说,只有当所有类型都完全匹配时,模板函数才会被包含在候选集中。不允许转换。

在您的情况下,替换您的 std::function<>使用更通用的模板参数 Func 就可以了。像下面的代码:

template<class Func>
struct wrapper
{
    wrapper(Func f, bool &called)
        : f_(f)
        , called_(called)
    {}

    template<class... Args>
    decltype(auto)
    operator() (Args&& ...args)
    {
        called_ = true;
        return f_(std::forward<Args>(args)...);
    }
private:
    Func f_;
    bool &called_;
};

template<class Func>
auto 
make_test_lambda(bool &called, Func func)
{
    called = false;
    return wrapper<Func>(func, called);
}

关于C++ lambda 测试拦截器/模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48117248/

相关文章:

Python:根据多个条件返回值的 Lambda 函数

java - 这个深奥的泛型错误是编译器错误还是新限制? (推断类型不符合上限)

c# - 删除列表中找到的字符串部分

c++ - 如何从二维数据生成 OpenCV 一维直方图?

c++ - Qt, linux, 添加构建日期和时间定义

java - 有没有办法使用 TestNG 数据提供程序为测试用例指定特定名称?

unit-testing - Xcode 4 : Application Tests in iOS Simulator

c# - 如何在单元测试中测试两个对象是否相等?

c++ - 空洞的大小是多少?

c++ - Libnodave - 使用 TCP 连接的 daveStart() 错误