单元测试(Kiwi):调用 loadView 和 viewDidLoad 后,测试中的属性始终为零

Posted

技术标签:

【中文标题】单元测试(Kiwi):调用 loadView 和 viewDidLoad 后,测试中的属性始终为零【英文标题】:Unit testing (Kiwi): Property is always nil in test after loadView and viewDidLoad are called 【发布时间】:2012-10-16 18:21:25 【问题描述】:

为了我自己的参考,我正在编写一个单元测试模板项目。这包括所有基本任务的模板代码,例如在 viewDidLoad 之后验证 UILabel 的文本属性是否按预期设置。

我有一个带有一个 UILabel 的 ViewController 的故事板。在 viewDidLoad 我设置它的文本。然后测试断言文本是否已按预期设置,但由于某种原因,UILabel 始终为 nil。当我运行应用程序时,一切都按预期工作(感谢上帝);显示带有预期文本标签的白色视图。

我使用 Kiwi 作为我的测试框架和 Xcode v4.5。

这里有一些代码:

ViewController.h:

@property (strong, nonatomic) IBOutlet UILabel *myLabel;

ViewController.m:

- (void)viewDidLoad 
    myLabel.text = @"test";

ViewControllerTests.m:

ViewController *vc = [[ViewController alloc] init];

// create view in memory by calling view's getter
[vc view];

// set myLabel.text to "test"
[vc viewDidLoad];

[vc.myLabel shouldNotBeNil];
[[vc.myLabel.text should] equal:@"test"];

上述测试失败,告诉我 myLabel 为 nil。

This *** answer 声明调用 loadView 将在内存中创建视图层次结构,从而准备任何子视图以供使用。 According to the documentation,只需调用 ViewController 视图的 getter 即可为您调用 loadView 并创建所有视图。因此,我发现测试时 myLabel = nil 非常奇怪。

【问题讨论】:

【参考方案1】:

在您的视图控制器中,您没有为 self.myLabel 分配值。

self.myLabel = [[UILabel alloc] init];

这意味着self.myLabel 有一个 nil 值,所以会出现以下顺序:[self myLabel] 返回 nil,[nil setText:@"test"] 什么也不做。所有这些都是标准行为。

当您从 nib 或 storyboard 加载视图控制器时,标签会根据在 IB 中的绘制方式分配,但调用 ViewController *vc = [[ViewController alloc] init] 不会加载 nib 或 storyboard。


更新

重新阅读我的帖子后,我想我留下了错误的印象。

您需要从 nib 或故事板加载,而不是添加 self.myLabel = [[UILabel alloc] init]

要从笔尖加载,请使用-initWithNibName:bundle: 而不是-init。要从故事板加载,首先使用+[UIStoryboard storyboardWithName:bundle:] 加载故事板,然后使用-[UIStoryboard instantiateViewControllerWithIdentifier:] 从故事板加载视图控制器。

【讨论】:

通过情节提要加载它非常有效。非常感谢。

以上是关于单元测试(Kiwi):调用 loadView 和 viewDidLoad 后,测试中的属性始终为零的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kiwi 测试 MagicalRecord 对象时,默认上下文为 nil

XCode 7 XCTest(Kiwi) +加载类别方法调用了两次

在 iOS 上使用委托进行 Kiwi 异步测试

使用 Kiwi 获取测试结果

iOS 开发 之 测试框架kiwi

尝试将 Magical Record 与 Kiwi 一起使用时构建测试时出错