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で可能です。テストコードでは、1行が目立ちます。

id mockGame = [OCMockObject partialMockForObject:game];

問題は、「ゲーム」はどこから来るのかということです。同じインスタンスが複数のテストで使用されていますか?表示されているエラーは、次のシーケンスが原因である可能性があります。部分モックでexpectを使用し、期待されるメソッドが呼び出され、次にメソッドが再度呼び出されますが、期待値が残っておらず、部分モックが認識していません。何をすべきか。

更新:OCMockを変更したので、そのような場合、モックはメソッドを実際のオブジェクトに転送するだけです。参照:https ://github.com/erikdoe/ocmock/commit/e03d4fe74465b4fe3fa33552e036de8986f8dec2

于 2012-08-23T13:53:08.607 に答える