在现代风格的 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 3 在单元测试中检查函数的返回值

C++11 现代C++风格的新元素--简介

在 OCMock 的 andDo 中访问参数时出现 EXC_BAD_ACCESS

不能在 Xcode 5.0 中使用 OCMock 2.1+ 存根类方法

是否可以在静态方法中 OCMock 类调用?

OCMock 没有传播到实现代码中 - iOS Xcode CocaPod