【问题标题】:OCMock failures "Another mock is already associated with object" with XCTest in XCode 7XCode 7 中的 XCTest 导致 OCMock 失败“另一个模拟已与对象关联”
【发布时间】:2016-03-09 21:31:07
【问题描述】:

我最近刚刚升级到 XCode 7,迫使我升级 OCMock 以便我支持 x64 架构。显然,在 OCMock 中进行了更改,它不允许重新模拟以前模拟的对象——换句话说,我有一个辅助方法可以执行以下操作:

-(MyObject *)getObject {
    Factory *factory = [self.dependencyInjector getInstance:factory];
    id mockFactory = [OCMockObject partialMockForObject:factory];
    [[[mockFactory stub] andReturn:@"important-value"] thing];
    return [[MYObject alloc] initWithFactory:mockFactory];
}

这以前工作得很好,但显然 OCMockObject 发生了变化,不允许重新模拟已经模拟的对象。由于注入器返回的工厂对象实际上是一个单例对象,因此对 getObject 方法的后续调用会多次调用 partialMockForObject: ,这会引发异常“Another mock is already associated with object”。

有什么方法可以让 OCMock 不报错?在模拟对象之前,我尝试在对象上调用 stopMocking,但这并不能解决此问题。解决它的唯一方法是执行以下操作:

-(MyObject *)getObject {
    if (!self.mockFactory) {
        Factory *factory = [self.dependencyInjector getInstance:factory];
        id mockFactory = [OCMockObject partialMockForObject:factory];
        [[[mockFactory stub] andReturn:@"important-value"] thing];
        self.mockFactory = mockFactory;
    }
    return [[MYObject alloc] initWithFactory:self.mockFactory];
}

这真的很烦人……

【问题讨论】:

    标签: xctest ocmock


    【解决方案1】:

    查看现在的代码,stopMocking 的实现显式地重置了关联对象 (https://github.com/erikdoe/ocmock/blob/dd5599695dcc50afe4d6bdff509ed3cbe389c667/Source/OCMock/OCPartialMockObject.m#L80)。我不知道如何调用stopMocking 并不能解决问题。能不能构建一个调试版的OCMock,在上面高亮的那行设置断点,看看有没有被调用?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2014-02-14
      • 1970-01-01
      • 2013-12-04
      • 2020-04-06
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多