2014-10-28 35 views
2

我正在使用Specta來創建一些測試,但我似乎無法獲得這個基本的通過。該應用程序本身工作正常,但這個測試不會通過。單元測試不叫viewDidAppear方法

的ViewController

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self showLogin]; 
} 

- (void)showLogin 
{ 
    [self presentViewController:[ETLoginVC new] animated:NO completion:nil]; 
    NSLog(@"PresentedVC: %@", [self.presentedViewController class]); 
} 

這將記錄:PresentedVC: ETLoginVC

規格

#import "Specs.h" 

#import "ETLoadingVC.h" 
#import "ETLoginVC.h" 

SpecBegin(ETLoadingVCSpec) 

describe(@"ETLoadingVC", ^{ 
    __block ETLoadingVC *loadingVC; 

    beforeEach(^{ 
     loadingVC = [[ETLoadingVC alloc] initWithUserDefaults:nil]; 
    }); 

    afterEach(^{ 
     loadingVC = nil; 
    }); 

    describe(@"no current user present", ^{ 
     it(@"should have a login view controller as the presented view controller", ^{ 
      expect(loadingVC.presentedViewController).to.beKindOf([ETLoginVC class]); 
     }); 
    }); 
}); 

SpecEnd 

這種失敗:the actual value is nil/null

我已經打過電話:

[loadingVC view]

我甚至發起了一個UIWindowappDelegate,但我只是無法得到它的工作。

我的視圖控制器都是用代碼編寫的。沒有故事板或筆尖。


UPDATE

現在我添加了獲取與類名即將呈現更新的NSString財產。然後我在我的測試中檢查這個字符串。爲了雖然得到這個工作,我有我的beforeEach塊更改爲以下:

beforeEach(^{ 
    loadingVC = [[ETLoadingVC alloc] initWithUserDefaults:nil]; 
    [loadingVC viewDidAppear:NO]; 
}); 

雖然測試通過,我得到以下信息:

Warning: Attempt to present <ETLoginVC: 0x7fcf34961940> on <ETLoadingVC: 0x7fcf34961280> whose view is not in the window hierarchy! 

我得到的,這是因爲我在當前視圖完成顯示之前調用viewDidAppear。我沒有得到的是我如何以更好的方式來測試這個。

我也不明白爲什麼loadingVC.presentedViewController仍然等於零即使這個更新的beforeEach塊。


更新2

改變beforeEach到下面擺脫了警告消息,現在presentedViewController是否設置正確。

beforeEach(^{ 
    mockUserDefaults = mock([NSUserDefaults class]); 
    loadingVC = [[ETLoadingVC alloc] initWithUserDefaults:mockUserDefaults]; 

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.rootViewController = loadingVC; 
    [window makeKeyAndVisible]; 

    [loadingVC viewDidAppear:NO]; 
}); 

回答

4

改變beforeEach以下內容似乎解決我的問題。

beforeEach(^{ 
    mockUserDefaults = mock([NSUserDefaults class]); 
    loadingVC = [[ETLoadingVC alloc] initWithUserDefaults:mockUserDefaults]; 

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.rootViewController = loadingVC; 
    [window makeKeyAndVisible]; 

    [loadingVC viewDidAppear:NO]; 
}); 
-1

單元測試對測試對象和邏輯更有用。您可能想要查看集成測試,該測試用於模擬實際的UI行爲。KIF是一個已經使用了很多的框架,並且構建在XCTest之上:http://www.raywenderlich.com/61419/ios-ui-testing-with-kif

所有東西都寫在Xcode裏面,所以你不需要任何額外的設置(除非你想做連續測試)。