0

Cedarでコントローラーをテストしようとしていますが、なぜ機能しないのかよくわかりません。コントローラが表示されることはなく、viewDidLoadまたはviewDidAppearが呼び出されることもありません。これはCedarが意図していないことですか、それとも私の間違いですか?

describe(@"MyController", ^{
    __block UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    __block UINavigationController *root = (UINavigationController *)[[[[UIApplication sharedApplication] delegate]window ]rootViewController];
    __block MyViewController *model = [storyboard instantiateViewControllerWithIdentifier:@"MyController"];

    [root pushViewController:model animated:YES];

    it(@"should test something", ^{
        expect(model.content).to(be_truthy);
    });
});
4

2 に答える 2

4

ユニットテストは同期して実行されます。テストは変更が行われる前に行われるため、アニメーション化されている、またはアニメーション化できるものはすべて、通常の単体テストでは機能しません。

表示されたときにViewControllerの状態をテストしようとしているようです。その場合、私たちが行うことはそれをプッシュすることではなく、それをロードすることです:

[model loadViewIfNeeded];

これにより、ストーリーボードからビューが読み込まれ、そのビューが呼び出されます-viewDidLoad。その後、その状態をテストできるはずです。

私はCedarを使用していませんが、ビューコントローラーのテスト駆動開発のOCUnitベースのスクリーンキャストを持っています:UIViewControllerTDDの実行方法

(ちなみに、「モデル」はコントローラーの非常に紛らわしい名前です。)

于 2013-01-25T00:07:32.237 に答える
0

私は通常、次のような設定でViewControllerを個別にテストします。

beforeEach(^{
            window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
            storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
            subject = [storyboard instantiateViewControllerWithIdentifier:@"ViewControllerName"];
            window.rootViewController = subject;
            [window makeKeyAndVisible];
            subject.view should_not be_nil;
}];
于 2017-01-17T21:21:34.440 に答える