2013-06-12 62 views
1

我正在測試我的一個UIViewController上的viewDidLoad事件。UnitTests和iOs:viewDidLoad觸發兩次

- (void)testMyView 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
    MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:MYID]; 
    [vc viewDidLoad]; 

    STAssertNotNil(vc, @"MyViewController should not be nil"); 
} 

如果我刪除線[vc viewDidLoad];,則viewDidLoad永遠不會觸發。

如果我讓[vc viewDidLoad];到位,viewDidLoad被觸發兩次。

我明白,視圖是惰性加載,但我怎樣才能避免這種行爲?

有沒有關於查看測試的最佳做法?

+0

使用viewDidAppear而不是viewDidLoad中... – lakesh

+0

你需要調用,而不是'-viewDidLoad' ...它贏得了'-loadView'法」被調用兩次。 – holex

+0

嗯,那是我的第一次嘗試,但它不起作用。 'vc.view.hidden = NO;'做了詭計。 –

回答

10

您需要訪問視圖才能自動加載視圖。

您可以使用這樣的事情做無副作用:

vc.view.hidden = NO; // Or YES if it is supposed to be hidden. 

哦,然後刪除您手動調用viewDidLoad因爲它不會是必要的。

+1

(void)vc.view;也可以工作,你不需要在.view上訪問任何屬性。訪問.view將加載視圖。 – possen

0

使用[vc view]進行延遲加載;

1

閱讀我的筆記https://github.com/onmyway133/blog/issues/52

假設我們有以下視圖控制器

class ListController: UIViewController { 
    override func viewDidLoad() { 
    super.viewDidLoad() 
    view.backgroundColor = .white 
    } 
} 

結識viewDidLoad中

我們知道viewDidLoad是在第一次創建視圖時調用的。因此,在單元測試,如果你使用的viewDidLoad觸發,你就會陷入一個陷阱

func testSetup() { 
    let controller = ListController() 
    controller.viewDidLoad() 
} 

爲什麼viewDidLoad中調用了兩次?

它是在您的測試 並在您的viewDidLoad方法調用一次,你訪問視圖,這是第一次創建,因此它會觸發viewDidLoad中再次

正確的方法

的最佳做法不是自己觸發事件,而是做一些事情使事情發生。在單元測試中,我們只訪問視圖觸發viewDidLoad中

func testSetup() { 
    let controller = ListController() 
    let _ = controller.view 
}