0

我正在尝试测试完成关卡后计时器对象是否停止。我有以下代码:

-(void)advanceLevel {
    int nextLevelId = self.currentLevel.id + 1;

    self.currentLevel = [[Level alloc] initWithIdentifier:nextLevelId];

    [self.timer stop];
    [self prepareLevel];
}

...

prepareLevel 方法重置计时器值并在其上调用“start” --- 所以为了测试advanceLevel 实际停止计时器,我需要覆盖prepareLevel 方法。

所以在我的单元测试中,我做了以下事情:

-(void)testItStopsTheTimer {
    [timer start];

    id mockGame = [OCMockObject partialMockForObject:game];
    [[[mockGame stub] andReturn:nil] prepareLevel];

    [game advanceLevel];

    STAssertFalse(timer.active, nil);
}

这导致 XCode 说“testItStopsTheTimer(Gametests)失败。最终出现在 Game-0x12383060 的子类转发器中......”

那么,是不是不可能把现有的方法存根,然后用虚无来代替呢?

4

2 回答 2

2

OCMock 绝对可以实现您想要做的事情。

方法签名有什么用prepareLevel?如果它返回 void,您的模拟设置应该是:

[[mockGame stub] prepareLevel];

不是:

[[[mockGame stub] andReturn:nil] prepareLevel];
于 2012-08-21T19:10:04.283 回答
1

OCMock 可以让您尝试做的事情。在您的测试代码中,有一行突出:

id mockGame = [OCMockObject partialMockForObject:game];

问题是,“游戏”从何而来?是否在多个测试中使用了相同的实例?您看到的错误可能是由以下顺序引起的:您在部分模拟上使用了 expect,调用了预期的方法,然后再次调用了该方法,但是现在没有期望了,部分模拟也不知道该怎么办。

更新:我刚刚更改了 OCMock,以便在这种情况下,模拟只是将方法转发给真实对象。见:https ://github.com/erikdoe/ocmock/commit/e03d4fe74465b4fe3fa33552e036de8986f8dec2

于 2012-08-23T13:53:08.607 回答