[英]How to write unit test for testing view controller?
我們正在嘗試編寫自定義單元測試,以分別測試每個視圖控制器。 我知道有UI自動化,KIF和其他解決方案,但是,如果您看一下上面的代碼,那么您會發現無需使用它們就可以做到這一點。
因此,為簡單起見,假設有一個帶有兩個公共方法“ setFirstState”和“ setSecondState”的簡單視圖控制器。 我需要測試,當視圖控制器完全實例化並顯示在屏幕上時(通過viewDidLoad)調用的是“ setFirstState”方法。 這是演示視圖控制器:
@interface MyViewController
- (void)setFirstState;
- (void)setSecondState;
@end
@implementation MyViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setFirstState];
}
@end
因此,用於測試setFirstState調用的單元測試可能看起來像(使用XCTest和OCMock):
- (void)test_viewDidLoad_CallsMyMethod {
MyViewController *viewContoller = [[MyViewController alloc] init];
id mock = [OCMockObject partialMockForObject:viewContoller];
[[mock expect] showLogin];
[UIApplication sharedApplication].keyWindow.rootViewController = (MyViewController *)mock;
[mock verify];
}
有趣的代碼行是將模擬(在viewController上)分配給keyWindow的rootViewController的代碼行。 我們發現如果要調用viewDidLoad,viewWillAppear方法,則需要這樣做。 否則將不會被調用。 但是,如果我們運行測試,則模擬器會掛在這條線上。 Xcode顯示它正在運行,並且仍在運行,但並沒有進一步發展。
我們還嘗試將keyWindow的rootViewController代碼行替換為“ [mock viewDidLoad]”,只是為了模擬和測試viewDidLoad,但它也會掛起。 因此,看起來部分模擬中斷了出現的視圖控制器的內部流程。
如果我們將刪除模擬並直接將視圖控制器分配給keyWindow的rootViewController,那么它將起作用,並且我們可以測試所有其他內容。 但是,也許有人知道我們該如何解決?
UPDATE忘記了我們使用Xib而不是Storyboards,因此系統中的每個組件都是松散耦合的。
事實證明,NewRelic庫正在破壞OCMock :)。 因此,將其注釋掉后,一切正常:
//[NewRelicAgent startWithApplicationToken:@"token"];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.