如何从 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;
访问
我正在为接收协议作为输入参数的函数编写单元测试。
我正在测试的这个函数在内部调用该协议的某些方法。
我想模拟这个协议和那个方法。
为了使用 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;