3

だから私はいくつかのテストケースを書いたクラスを持っています。このクラスには、次の2つのメソッドがあります。

- (void)showNextNewsItem {
    self.xmlUrl = self.nextNewsUrl;
    [self loadWebViewContent];
}

- (void)showPreviousNewsItem {
    self.xmlUrl = self.previousNewsUrl;
    [self loadWebViewContent];
}

リファクタリングすることができ、これは非常に原始的ですが、それでも、次のロードと前のロードを確認したいだけです。したがって、OCMockを使用してOCMockObject、次のようにSUTクラスのをインスタンス化します。

- (void)testShowNextOrPreviousItemShouldReloadWebView {

    id mockSut = [OCMockObject mockForClass:[NewsItemDetailsViewController class]];

    [[[mockSut expect] andReturn:@"http://www.someurl.com"] nextNewsUrl];
    [[mockSut expect] loadWebViewContent];

    [[[mockSut expect] andReturn:@"http://www.someurl.com"] previousNewsUrl];
    [[mockSut expect] loadWebViewContent];

    [mockSut showNextNewsItem];
    [mockSut showPreviousNewsItem];

    [mockSut verify];
}

問題は、検証対象の何かを実行するメソッドを実際に呼び出す2行にあります。OCMockは今、私に、それを呼び出すことは期待されshowNextNewsItemshowPreviousNewsItemいないことを教えてくれます。もちろん、私はテスト中であり、本番コード自体で特定のことが起こることだけを期待しているため、これは予期されていません。

嘲笑の概念のどの部分が正しく理解できなかったのですか?

4

2 に答える 2

2

テスト中のクラスをモックするのは一般的に混乱しますが、そうしたい場合は、「部分モック」が必要です。これにより、メソッドをスタブ化せずに呼び出して、通常のメソッドを実行させることができます。

docsによると、これはOCMockでサポートされているようです。

于 2013-01-19T18:09:17.433 に答える
2

解決策を見つけました。オブジェクトで partialMock を使用すると、まさに私が望むことができます。このように、明示的に定義した呼び出しはモックされ、「モックされていない」オブジェクトでテスト中のメソッドを呼び出します。

- (void)testShowNextOrPreviousItemShouldReloadWebView {

    NewsItemDetailsViewController *sut = [[NewsItemDetailsViewController alloc] init];

    id mockSut = [OCMockObject partialMockForObject:sut];

    [[[mockSut expect] andReturn:@"http://www.someurl.com"] nextNewsUrl];
    [[mockSut expect] loadWebViewContent];

    [[[mockSut expect] andReturn:@"http://www.someurl.com"] previousNewsUrl];
    [[mockSut expect] loadWebViewContent];

    [sut showNextNewsItem];
    [sut showPreviousNewsItem];

    [mockSut verify];
}
于 2013-01-19T18:13:15.730 に答える