在现代风格的 OCMock 中使用 ignoringNonObjectArgs 时崩溃
Posted
技术标签:
【中文标题】在现代风格的 OCMock 中使用 ignoringNonObjectArgs 时崩溃【英文标题】:Crash when using ignoringNonObjectArgs in OCMock in modern style 【发布时间】:2017-07-06 08:56:09 【问题描述】:我正在尝试使用 OCMock 框架模拟下面提到的方法,该框架将整数变量作为第二个参数。我也尝试过使用旧式 OCMock 存根调用,结果相同。使用现代语法,我编写的代码如下。
@interface Session : NSObject
- (Request *)RequestForURL:(NSURL *)url
flags:(unsigned int)flags
error:(NSError **)error;
@end
这个会话类是模拟的,我想从这个模拟的方法返回模拟的请求。
id session = OCMClassMock(Session.class);
id Request = OCMClassMock(Request.class);
OCMStub([[session ignoringNonObjectArgs] RequestForURL:(NSURL *)OCMArg.anyObjectRef flags:0 error:OCMArg.anyObjectRef]).andReturn(Request);
这编译得很好。但是在运行测试时它在调用时崩溃 请求URL 我知道我正在使用现代 OCMock 语法。我认为错误发生在以某种方式未被忽略的标志中。
【问题讨论】:
【参考方案1】:好吧,结果是我犯了一个愚蠢的错误。 anyObjectRef 是引用,any 是 id,这里我们需要一个 id,我使用 ref 并将其转换为 NSURL * ... [facepalm on me]
正确方法:
OCMStub([[session ignoringNonObjectArgs] RequestForURL:OCMArg.any flags:0 error:OCMArg.any]).andReturn(Request);
【讨论】:
你可以使用 [OCMArg isKindOfClass:NSURL.Class] 代替 OCMArg.any 。以上是关于在现代风格的 OCMock 中使用 ignoringNonObjectArgs 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 OCMock 的 andDo 中访问参数时出现 EXC_BAD_ACCESS