当参数不是预期的参数时,OCMock 抛出 NSInternalInconsistencyException

Posted

技术标签:

【中文标题】当参数不是预期的参数时,OCMock 抛出 NSInternalInconsistencyException【英文标题】:OCMock throwing NSInternalInconsistencyException when parameters are not the ones expected 【发布时间】:2011-05-06 12:55:18 【问题描述】:

我正在为委托对象设置一个模拟对象,以检查当 URL 为 nil 时,以 nil 作为参数调用委托方法。

FileDownloadOperation 表现如预期时,测试通过,这很好。

FileDownloadOperation 不调用委托方法时,测试按预期失败。

但是当FileDownloadOperation 使用nil 以外的其他方法调用委托方法时,测试不会失败,而是会崩溃并且不会执行其他测试,因为OCMock 会抛出:

'NSInternalInconsistencyException' 原因:'OCMockObject[FileDownloadOperationTest]:调用了意外的方法:数据: forURL:nil

  -(void) testNilURL
      // 1. Create an operation
      FileDownloadOperation * anOp = [[FileDownloadOperation alloc]init];
      // 2. set a nil URL
      anOp.URL = nil;
      // 3. set a mock delegate
      id mockDelegate = [OCMockObject mockForClass:[self class]];
      [[mockDelegate expect] data:[OCMArg isNil] forURL:[OCMArg isNil]];
      anOp.delegate = mockDelegate;
      // 4. launch operation
      [anOp main];
      // 5. ASSERT mock delegate is called with nil data
      STAssertNoThrow([mockDelegate verify], @"Delegate should be called with nil data and nil URL");
      [anOp release];
    

这是预期的行为吗?还是我做错了什么? 谢谢!

【问题讨论】:

这在 ios 5.0 模拟器中已解决,现在 OCMock 只报告测试失败。 【参考方案1】:

OCMock 抛出异常来报告不匹配,信任 OCUnit 来捕获和报告任何异常。但是due to a bug in the iOS Simulator,单元测试无法捕获异常,所以干脆崩溃了。

(我目前正在编写一个新的模拟框架,通过不依赖异常来解决这个问题。)

【讨论】:

以上是关于当参数不是预期的参数时,OCMock 抛出 NSInternalInconsistencyException的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 OCMock 测试是不是调用了超类吗?

OCMock 对带有参数的方法进行 OCMock 并返回一个值

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

当传递给 main 的参数过多/过少时抛出异常

OCMock: OCMPartialMock 对象调用实际方法而不是存根

为啥当参数为null时,postgres会抛出异常?