0

我正在尝试使用 Cedar 测试控制器,但无法真正理解为什么它不起作用。控制器永远不会被显示,viewDidLoad 或 viewDidAppear 永远不会被调用。这是雪松不应该做的事情还是只是我的错误?

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

单元测试同步运行。任何动画(或可能动画)在正常的单元测试中都不起作用,因为测试将在更改发生之前完成。

看起来您正在尝试测试视图控制器显示时的状态。在这种情况下,我们所做的不是推送它,而是加载它:

[model loadViewIfNeeded];

这将从故事板加载视图,然后调用其-viewDidLoad. 然后,您应该能够测试其状态。

我不使用 Cedar,但我确实有一个基于 OCUnit 的视图控制器的测试驱动开发截屏:How to Do UIViewController TDD

(顺便说一下,“模型”对于控制器来说是一个非常令人困惑的名称。)

于 2013-01-25T00:07:32.237 回答
0

我通常使用以下设置单独测试我的视图控制器:

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 回答