如何从NSInvocation中提取“函数”类型的参数

时间:2017-06-08 01:46:26

标签: objective-c unit-testing ocmock nsinvocation

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

现在模拟我正在使用OCMStub的功能。 有趣的是,函数不返回任何值,而是将回调作为输入参数进行调用并调用它。 这是它的签名: - (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)的函数变量?

2 个答案:

答案 0 :(得分:1)

这是一个功能。这是一个街区!

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

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

答案 1 :(得分:0)

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

我刚刚声明了一个变量“块”&#39;输入不正确。
我也意识到第一个参数应该由index = 2;

访问