繁体   English   中英

单元测试(Kiwi):在调用loadView和viewDidLoad之后,属性在测试中总是为零

[英]Unit testing (Kiwi): Property is always nil in test after loadView and viewDidLoad are called

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

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

我使用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是零。

此StackOverflow应答表明调用loadView将在内存中创建视图层次结构,从而准备任何子视图以供使用。 根据文档 ,只需调用ViewController视图的getter就会为您调用loadView并创建所有视图。 因此,我发现测试时myLabel = nil非常奇怪。

在视图控制器中,您没有为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。


更新

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM