我正在使用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]
我甚至發起了一個UIWindow
和appDelegate
,但我只是無法得到它的工作。
我的視圖控制器都是用代碼編寫的。沒有故事板或筆尖。
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];
});