6

私は OCMockito を使用しており、ViewController で NetworkFetcher オブジェクトとブロックを使用するメソッドをテストしたいと考えています。

- (void)reloadTableViewContents
{
    [self.networkFetcher fetchInfo:^(NSArray *result, BOOL success) {
        if (success) {
            self.model = result;
            [self.tableView reloadData];
        }
    }];
}

特に、ネットワークにヒットせずにダミー配列をfetchInfo:返すようにモックし、メソッドが呼び出され、モデルが本来あるべきものであることを確認したいと思います。resultreloadDataUITableView

このコードは非同期であるため、何らかの方法でブロックをキャプチャし、テストから手動で呼び出す必要があると想定しています。

どうすればこれを達成できますか?

4

2 に答える 2

5

これはとても簡単です:

- (void) testDataWasReloadAfterInfoFetched 
{
    NetworkFetcher mockedFetcher = mock([NetowrkFetcher class]);
    sut.networkFetcher = mockedFetcher;

    UITableView mockedTable = mock([UITableView class]);
    sut.tableView = mockedTable;

    [sut reloadTableViewContents];

    MKTArgumentCaptor captor = [MKTArgumentCaptor new];
    [verify(mockedFetcher) fetchInfo:[captor capture]];

    void (^callback)(NSArray*, BOOL success) = [captor value];

    NSArray* result = [NSArray new];
    callback(result, YES);

    assertThat(sut.model, equalTo(result));
    [verify(mockedTable) reloadData];
}

すべてを 1 つのテスト メソッドにまとめましたが、 と の作成を移動するmockedFetchermockedTablesetUp他のテストで同様のコード行を節約できます。

于 2014-05-26T19:17:23.090 に答える