为啥我不能直接将 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()?
为啥可以将 void(*)(int x, int y) 传递给期望 void(*)() 的 attachInterrupt?