使用 Cedar 测试 iOS 控制器
Posted
技术标签:
【中文标题】使用 Cedar 测试 iOS 控制器【英文标题】:iOS testing controllers with Cedar 【发布时间】:2013-01-22 19:24:53 【问题描述】:我正在尝试使用 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);
);
);
【问题讨论】:
【参考方案1】:单元测试同步运行。任何已经(或可以)动画的东西在正常的单元测试中都不起作用,因为测试将在更改发生之前完成。
看起来您正在尝试测试视图控制器显示时的状态。在这种情况下,我们所做的不是推送它,而是加载它:
[model loadViewIfNeeded];
这将从故事板加载视图,然后调用其-viewDidLoad
。然后您应该能够测试其状态。
我不使用 Cedar,但我有一个基于 OCUnit 的视图控制器测试驱动开发截屏:How to Do UIViewController TDD
(顺便说一下,“模型”对于控制器来说是一个非常令人困惑的名称。)
【讨论】:
模型名称来自 Cedar(为测试创建模板),但我同意。我稍后会试试这个。谢谢。 我的 VC 测试有问题!谢谢! 名称“模型”是默认值,旨在替换为正在测试的实际对象。【参考方案2】:我通常使用如下设置单独测试我的视图控制器:
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;
];
【讨论】:
以上是关于使用 Cedar 测试 iOS 控制器的主要内容,如果未能解决你的问题,请参考以下文章
使用 Cedar 测试presentedViewController 的存在
如何设置 cedar 以对 ios 应用程序进行 bdd 测试?
使用 TestFlight 进行内部测试时,啥是好的 iOS 应用版本控制策略?