为啥我不能直接将 int 或 bool 传递给 OCMock 的“andReturnValue”参数?

Posted

技术标签:

【中文标题】为啥我不能直接将 int 或 bool 传递给 OCMock 的“andReturnValue”参数?【英文标题】:why can I not just pass an int or bool directly into the OCMock's "andReturnValue" argument?为什么我不能直接将 int 或 bool 传递给 OCMock 的“andReturnValue”参数? 【发布时间】:2012-08-16 23:03:27 【问题描述】:

我试图这样做:

[[[mockQuestion stub] andReturnValue:YES] shouldNegate];
[[[mockQuestion stub] andReturnValue:123] randomNumberWithLimit];

但这给了我这个警告/错误“不兼容的整数指针转换将'BOOL'(又名'signed char')发送到'NSValue *'类型的参数”

我能想出解决它的唯一方法是:

BOOL boolValue = YES;
int num = 123;

[[[mockQuestion stub] andReturnValue:OCMOCK_VALUE(boolValue)] shouldNegate];
[[[mockQuestion stub] andReturnValue:OCMOCK_VALUE(num)] randomNumberWithLimit];

但这让我的测试代码显得过于冗长。有没有办法在无需设置变量的情况下内联执行所有这些操作?

【问题讨论】:

【参考方案1】:

您可以使用类似于(type)value 的文字样式。这通常用于创建结构文字,但也适用于基本数据类型。这里的重要方面是这种类型的文字创建了一个可以处理的临时文件。这意味着您可以像这样编写代码

[[[mockQuestion stub] andReturnValue:OCMOCK_VALUE((BOOL)YES)] shouldNegate];
[[[mockQuestion stub] andReturnValue:OCMOCK_VALUE((int)123)] randomNumberWithLimit];

【讨论】:

谢谢,这应该会在我的测试中删除相当多的样板! 也不知道这种语法。这是新的吗?我会相应地更新 OCMock 文档。 @ErikDoernenburg:它们被称为“复合文字”,是在 C99 中引入的。所以他们已经存在了十多年,尽管出于某种原因他们并不是很出名。【参考方案2】:

参数应该是一个对象指针。在这种情况下,它应该指向 NSValue 类的一个对象。

【讨论】:

以上是关于为啥我不能直接将 int 或 bool 传递给 OCMock 的“andReturnValue”参数?的主要内容,如果未能解决你的问题,请参考以下文章

C++:为啥我不能将一对迭代器传递给 regex_search?

为啥我不能将字符串传递给函数 GetDriveTypesA()?

使用 AnyObject 时 Bool 被视为 int

为啥可以将 void(*)(int x, int y) 传递给期望 void(*)() 的 attachInterrupt?

为啥我们不能通过值传递数组来函数?

为啥我不能将模板函数指针传递给可变参数函数?