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

Ios 单元测试(Kiwi):调用loadView和viewDidLoad后,测试中的属性始终为零,ios,unit-testing,tdd,ios6,Ios,Unit Testing,Tdd,Ios6,为了我自己的参考,我正在写一个单元测试模板项目。这包括所有基本任务的模板代码,例如验证UILabel的文本属性在viewDidLoad后是否按预期设置 我有一个带有一个UILabel的ViewController的故事板。在viewDidLoad中,我设置了它的文本。然后,测试断言文本是否已按预期设置,但由于某些原因,UILabel始终为零。当我运行应用程序时,一切都按预期运行(感谢上帝);将显示一个白色视图,其中包含一个带有预期文本的标签 我使用Kiwi作为我的测试框架和Xcode v4.5

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

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

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

下面是一些代码:

ViewController.h:

@property (strong, nonatomic) IBOutlet UILabel *myLabel;
- (void)viewDidLoad {
    myLabel.text = @"test";
}
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"];
ViewController.m:

@property (strong, nonatomic) IBOutlet UILabel *myLabel;
- (void)viewDidLoad {
    myLabel.text = @"test";
}
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"];
ViewControllerTests.m:

@property (strong, nonatomic) IBOutlet UILabel *myLabel;
- (void)viewDidLoad {
    myLabel.text = @"test";
}
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为零


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

在视图控制器中,您没有给self.myLabel赋值

self.myLabel = [[UILabel alloc] init];
这意味着
self.myLabel
有一个nil值,因此出现以下序列:
[self-myLabel]
返回nil,
[nil-setText:@“test”]
不执行任何操作。所有这些都是标准行为

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


更新

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

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


要从nib加载,请使用
-initWithNibName:bundle:
而不是
-init
。要从情节提要加载,首先使用
+[UIStoryboard storyboard withname:bundle://code>加载情节提要,然后使用
-[UIStoryboard instanceevieviewcontrollerwhithidentifier:][/code>

从情节提要加载视图控制器。在视图控制器中,您没有将值分配给
self.myLabel

self.myLabel = [[UILabel alloc] init];
这意味着
self.myLabel
有一个nil值,因此出现以下序列:
[self-myLabel]
返回nil,
[nil-setText:@“test”]
不执行任何操作。所有这些都是标准行为

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


更新

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

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


要从nib加载,请使用
-initWithNibName:bundle:
而不是
-init
。要从情节提要加载,请首先使用
+[UIStoryboard storyboard withname:bundle://code>加载情节提要,然后使用
-[UIStoryboard instanceevieviewcontrollerwhithidentifier:][/code>

从情节提要加载视图控制器。非常感谢。通过故事板加载效果非常好。非常感谢你。