簡體   English   中英

如何編寫用於測試視圖控制器的單元測試?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM