簡體   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