Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何提取';功能';从NSInvocation输入_Objective C_Unit Testing_Ocmock_Nsinvocation - Fatal编程技术网

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]