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

C++ lambda testing interceptor/mock

本文关键字:模拟 lambda 测试 C++      更新时间:2023-10-16

我正在寻找一种解决方案,如何创建拦截器/模拟 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);

它不起作用no matching function for call.你可以帮我吗?

谢谢!

问题是每个 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);
}