0

私はOCUnitとOCMockに比較的慣れていないので、ご容赦ください。ページ数が NSArray (Core Data から入力される) のカウントから計算される UIPageControl を含むビュー コントローラーがあります。これは、次のように ViewDidLoad メソッドで行われます。

- (void)ViewDidLoad {
    [super viewDidLoad];

    ... other code ...

    self.pageControl.numberOfPages = [self.viewedPages count];
    self.pageControl.currentPage = 0;

    NSLog(@"%d", controller.pageControl.numberOfPages);
    NSLog(@"%d", [controller.viewedPages count]);
}

ログには、viewedPages と numberOfPages の両方に一致する整数値が表示されます。ありがたいことに、以下のテストを実行すると、アサーションは true です。

- (void)testPageControl {
    [controller viewDidLoad];
    STAssertTrue(controller.pageControl.numberOfPages == [controller.viewedPages count], @"...");
}

ただし、前述のように、このプロセスは Core Data のオブジェクトを含む配列の使用に依存しているため、OCMock を使用してこれを事前定義済みの配列に置き換え、Core Data 要素を効果的に削除することにしました。そうすることで、私は今、理解できない結果を得ています。

私の新しいテストは次のようになります。

- (void)testPageControl {
    id mock = [OCMockObject partialMockForObject:controller];
    NSArray *mockPagesArray = [NSArray alloc] initWithObjects:...];
    [[[mock stub] andReturn:mockPagesArray] viewedPages];

    [controller viewDidLoad];

    NSLog(@"%d", [controller.pageControl numberOfPages]);
    NSLog(@"%d", [controller.viewedPages count]);
    STAssertTrue(controller.pageControl.numberOfPages == [controller.viewedPages count], @"...");
    [mockPagesArray release];
}

私を混乱させているのは、このシナリオで NSLog が、viewedPages カウントが私が作成したモック配列のカウントと一致することを示していることです (すばらしい!) が、numberOfPages は常にゼロですか? その結果、テストは失敗します。

また、コントローラーにviewPages配列をロードする関数を、事前定義された配列を返すテストコントローラーのローカル関数、つまり、

[[[mock stub] andCall:@selector(createMockPageViews) onObject:self] loadPageViews];

ただし、これは上記とまったく同じ結果になりました。numberOfPages が 0 を返すため、テストは失敗しますが、viewedPages 配列は予想されるカウントを示します。

私が言ったように、私は OCUnit と OCMock を初めて使用するので、この質問ができるだけ詳細で意味のあるものであることを願っています。これが OCMock の仕組みについての私の誤解によるものであり、誰かが私を修正してくれることを願っています - 私は永遠に感謝します! 残念ながら、iPhone 開発用の OCUnit と OCMock について、初心者向けの適切なドキュメントが不足しているようです。

前もって感謝します

4

1 に答える 1

1

あなたcontroller.pageControlはおそらくゼロです。これは、IBOutlet に配線されていないか、初期化されていないか、アプリの実行可能ファイル内で単体テストが実際に実行されていないことが原因である可能性があります。単体テストのターゲットを設定する手順を見て、設定を確認してください。

または、UIPageControl オブジェクトをモックすることもできます。

- (void)testPageControl {
    id mockPageControl = [OCMockObject mockForClass:[UIPageControl class]];
    [[mockPageControl expect] setNumberOfPages:3];
    [[mockPageControl expect] setCurrentPage:0];

    id mock = [OCMockObject partialMockForObject:controller];
    NSArray *mockPagesArray = [NSArray alloc] initWithObjects:...];
    [[[mock stub] andReturn:mockPagesArray] viewedPages];
    [[[mock stub] andReturn:mockPageControl] pageControl];

    [controller viewDidLoad];

    [mockPageControl verify];
}
于 2011-12-12T21:12:35.500 に答える