是否可以从Storyboard实例化视图控制器以进行Kiwi测试

时间:2013-07-15 16:33:50

标签: ios uiviewcontroller storyboard kiwi

我正在测试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?

我是否遗漏了要包含在测试目标中的内容?

2 个答案:

答案 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函数。