我正在为接收协议作为输入参数的函数编写单元测试
我正在测试的这个函数调用了该协议的一些方法。
我想嘲笑这个协议和那个方法
要使用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)
的函数变量?
答案 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;