我正在编写一个单元测试模板项目,供我自己参考。这包括所有基本任务的模板代码,例如验证在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为零。
This StackOverflow answer表示调用loadView将在内存中创建视图层次结构,从而准备任何子视图以供使用。 According to the documentation,只需调用ViewController视图的getter就会为你调用loadView并创建所有视图。因此,我发现在测试时myLabel = nil非常奇怪。
答案 0 :(得分:4)
在视图控制器中,您没有为self.myLabel
分配值。
self.myLabel = [[UILabel alloc] init];
这意味着self.myLabel
的值为零,因此会出现以下序列:[self myLabel]
返回nil,[nil setText:@"test"]
不执行任何操作。所有这些都是标准行为。
从笔尖或情节提要板加载视图控制器时,会根据IB中插座的绘制方式分配标签,但调用ViewController *vc = [[ViewController alloc] init]
不会加载笔尖或故事板。
<强>更新强>
重新阅读我的帖子后,我认为我留下了错误的印象。
您需要从笔尖或故事板加载,而不是添加self.myLabel = [[UILabel alloc] init]
。
要从笔尖加载,请使用-initWithNibName:bundle:
代替-init
。要从故事板加载,首先使用+[UIStoryboard storyboardWithName:bundle:]
加载故事板,然后使用-[UIStoryboard instantiateViewControllerWithIdentifier:]
从故事板加载视图控制器。