Objective c 如何提取';功能';从NSInvocation输入
我正在为接收协议作为输入参数的函数编写单元测试。Objective c 如何提取';功能';从NSInvocation输入,objective-c,unit-testing,ocmock,nsinvocation,Objective C,Unit Testing,Ocmock,Nsinvocation,我正在为接收协议作为输入参数的函数编写单元测试。 我正在测试的这个函数在内部调用该协议的某些方法。 我想模拟这个协议和那个方法。 为了使用OCMock模拟协议,我编写了以下代码: id myProtocol=OCMProtocolMock(@protocol(myProtocol)) 现在来模拟我正在使用的OCMStub函数。 有趣的是,函数不返回任何值,而是获取回调作为输入参数并调用它。 签名如下: -(void)myFunction:(void(^ u Nonnull)(NSDictiona
我正在测试的这个函数在内部调用该协议的某些方法。 我想模拟这个协议和那个方法。
为了使用OCMock模拟协议,我编写了以下代码:
id myProtocol=OCMProtocolMock(@protocol(myProtocol))代码>
现在来模拟我正在使用的OCMStub函数。
有趣的是,函数不返回任何值,而是获取回调作为输入参数并调用它。
签名如下:
-(void)myFunction:(void(^ u Nonnull)(NSDictionary*\u Nonnull))完成代码>
我正在编写以下代码来模拟此函数:
OCMStub([myProtocol myFunction:[OCMArg any]])。\u和do(^(NSInvocation*调用){
无效(^非空)(NSDictionary*_非空)完成;
[调用getArgument:&完成索引:0];
//在这里,我将使用一些字典调用完成回调并调用调用
});代码>
但是我得到了以下错误:“预期的标识符或”(“
”。错误指向定义完成
变量的行
如何定义签名的函数变量void(^\u Nonnull)(NSDictionary*\u Nonnull)
?那不是函数。它是块
不管怎样,函数和块在声明中都可以被视为void*
。之后需要将它们转换为适当的类型
但这可能是处理它最简单的方法;从调用中提取为void*
,转换为块,调用它。实际上,我可以通过执行以下操作提取第一个参数:
OCMStub([myProtocol myFunction:[OCMArg any]])。\u和do(^(NSInvocation*调用){
无效(^完成)(NSDictionary*\u非空);
[调用getArgument:&完成索引:2];
//做其他事情
});
我只是错误地声明了一个“block”类型的变量。
我还意识到,第一个参数应该通过index=2访问;谢谢!您还可以添加一个如何对块进行强制转换的示例吗?感谢您注意到它被命名为“block”!我已经学会了如何创建“block”类型的变量,它解决了这个问题。不需要声明void*
变量并强制转换它作为块类型变量的地址,可以直接传递到[NSInvocation getArgument]