我正在测试ViewController中的一些代码(某些控件是活动的,具体取决于某些UISwitch的状态等),并决定为它使用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“找不到一个在管束一个NSBundle&LT名为 'MainStoryboard' 的故事板; /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/Developer/usr/ bin>(已加载)“已提升
我已将MainStoryboard包含在我的测试目标中,并且还将其包含在“Build Phases”中 - > “复制捆绑资源”仍然没有。
所以我想知道是否甚至可以从Kiwi测试目标中的故事板中实例化ViewController? (因为我在任何地方都没有看到它的任何例子)。
我的方法是否错误,我应该嘲笑ViewController?
我是否遗漏了要包含在测试目标中的内容?
答案 0 :(得分:0)
问题是您正在为您的捆绑传递nil
。您可以在错误消息中看到它正在使用的包。在单元测试中,您可能希望执行以下操作:
Class viewControllerClass = [myViewController class];
NSString *className = NSStringFromClass(viewControllerClass);
NSBundle *classBundle = [NSBundle bundleForClass:viewControllerClass];
MyViewController *viewController =
[[MyViewController alloc] initWithNibName:className
bundle:classBundle];
通过查找包含视图控制器类的包,您还将获得它的nib文件。
对于故事板,代码类似:
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];
(这都假定您的笔尖名称和故事板标识符与类名匹配。如果不匹配,请更改它。)
答案 1 :(得分:0)
" AViewController"没有任何控件初始化
是因为所有这些控件的初始化都属于视图,你需要调用[viewController loadView]来初始化UI组件。
如果你还使用viewDidLoad func来初始化一些UI组件,你必须调用[viewController view]来触发viewDidLoad函数。