2013-07-15 1 views
1

Я тестирую некоторый код в ViewController (что некоторые элементы управления активны в зависимости от состояния определенных UISwitches и т. Д.), И решил пойти на Kiwi для это, поскольку мы используем его для некоторых других низкоуровневых логических тестов.Возможно ли создать экземпляр контроллера просмотра из раскадровки для тестирования киви?

Я ожидаю, чтобы запустить тесты, как это:

__block AViewController *aVC; 

it(@"(tokenTextField) should be hidden if the token switch is set to off", ^{ 
    lvC.useTokenSwitch.on = false; 
    [[theValue(aVC.tokenTextField.hidden) should] equal:theValue(YES)]; 
}); 

Моя проблема с инициализацией в AViewController. Если бы я сделал:

aVC = [[AViewController alloc] initWithNibName:@"aViewController" bundle:nil]; 

Я бы получить «AViewController» без какого-либо контроля инициализированных, так что я должен был бы инициализировать каждый из них вручную.

Так что я попытался получения AViewController делать это:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
aVC = [storyboard instantiateViewControllerWithIdentifier:@"AViewController"]; 

Однако это приводит к сообщению об ошибке:

NSInvalidArgumentException «Не удалось найти раскадровку под названием 'MainStoryboard' в расслоении NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/Developer/usr/bin> (загружен) "поднято

Я включил MainStoryboard в свою целевую аудиторию, а также включил его в «Build Phases» -> «Copy Bundle Resources» и до сих пор ничего.

Так что мне интересно, возможно ли даже создать экземпляр ViewController из раскадровки в целевой тесте киви? (Как я нигде не видел никаких примеров).

Является ли мой подход неправильным, и я должен высмеивать ViewController?

Я пропустил что-то для включения в тестовую цель?

+0

Я могу создать экземпляр раскадровки таким образом. На самом деле, я * не * включаю раскадровку в целевую аудиторию или фазу сборки Copy Bundle Resources, но я просто пробовал ее в обоих направлениях и в любом случае работает для меня. –

+0

Спасибо, после того, как я обогнал, мне удалось создать его успешно. Однако теперь я застреваю тогда, я выполняю: [aVC выполнитьSelectorOnMainThread: @selector (loadView) withObject: nil waitUntilDone: YES]; Потому что это приводит к: NSInvalidArgumentException "- [__ NSCFType pointSize]: непризнанный селектор, отправленный в экземпляр 0x21f4690" – Katagelon

ответ

0

Проблема в том, что вы передаете nil для своего пакета. Вы можете увидеть в сообщении об ошибке комплект, который он использует. В модульном тесте, вы, вероятно, хотите сделать что-то вроде этого:

Class viewControllerClass = [myViewController class]; 

NSString *className = NSStringFromClass(viewControllerClass); 
NSBundle *classBundle = [NSBundle bundleForClass:viewControllerClass]; 

MyViewController *viewController = 
[[MyViewController alloc] initWithNibName:className 
            bundle:classBundle]; 

Ища пучок, который содержит класс вашей точки зрения контроллера, вы также получите файл острия для него.

Для раскадровки, код аналогичен:

Class viewControllerClass = [myViewController class]; 

NSString *className = NSStringFromClass(viewControllerClass); 
NSBundle *classBundle = [NSBundle bundleForClass:viewControllerClass]; 

UIStoryboard *storyboard = 
[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:classBundle]; 

MyViewController *viewController = 
[storyboard instantiateViewControllerWithIdentifier:className]; 

(Все это предполагает, что ваши перьевые имена и раскадровки идентификаторы совпадают с именами классов Если они не измените его.).

0

«AViewController» без каких-либо элементов управления инициализируется

потому, что инициализация всех этих управлений принадлежат просмотра, вам нужно позвонить [viewCo ntroller loadView] для инициализации компонента пользовательского интерфейса.

Если вы также используете функцию viewDidLoad для инициализации некоторого компонента пользовательского интерфейса, вы должны вызвать [viewController view] для запуска функции viewDidLoad.