如何从 NSInvocation 中提取 'function' 类型的参数

How to extract an argument of 'function' type from NSInvocation

我正在为接收协议作为输入参数的函数编写单元测试。
我正在测试的这个函数在内部调用该协议的某些方法。 我想模拟这个协议和那个方法。
为了使用 OCMock 模拟协议,我写了以下内容: id<MyProtocol> myProtocol = OCMProtocolMock(@protocol(MyProtocol));

现在模拟我正在使用 OCMStub 的函数。 有趣的是,该函数没有 return 任何值,而是获取回调作为输入参数并调用它。 这是它的签名: - (void)myFunction:(void (^ _Nonnull)(NSDictionary<NSString *, NSString *> * _Nonnull))completion;

我正在编写以下代码来模拟此函数:
OCMStub([myProtocol myFunction:[OCMArg any]])._andDo(^(NSInvocation *invocation){ void (^ _Nonnull)(NSDictionary<NSString *, NSString *> * _Nonnull) completion; [invocation getArgument:&completion atIndex:0]; // Here I will invoke the completion callback with some dictionary and invoke the invocation });

但是我收到以下错误:“Expected identifer or '('”。错误指向定义 completion 变量的行。

如何定义签名void (^ _Nonnull)(NSDictionary<NSString *, NSString *> * _Nonnull)的函数变量?

那不是函数。是块!

无论如何,函数和块都可以在声明中视为 void *。之后您需要将它们转换为适当的类型。

但这可能是处理它的最简单方法;从调用中提取为 void*,转换为块,调用它。

实际上,我可以通过执行以下操作来提取第一个参数:
OCMStub([myProtocol myFunction:[OCMArg any]])._andDo(^(NSInvocation *invocation){ void (^ completion)(NSDictionary<NSString *, NSString *> * _Nonnull); [invocation getArgument:&completion atIndex:2]; // Do other stuff });

我只是错误地声明了一个 'block' 类型的变量。
而且我还意识到第一个参数应该通过 index = 2;

访问