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“在捆绑包 NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/Developer/usr/bin> 中找不到名为“MainStoryboard”的故事板(已加载)“ 提高

我已将 MainStoryboard 包含在我的测试目标中,并将其包含在“构建阶段”->“复制捆绑资源”中,但仍然没有。

所以我想知道是否可以从 Kiwi 测试目标中的 Storyboard 实例化 ViewController?(因为我在任何地方都没有看到任何例子)。

我的方法是错误的,我应该嘲笑 ViewController 吗?

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

4

2 回答 2

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];

(这一切都假设您的 nib 名称和情节提要标识符与类名称匹配。如果不匹配,请更改它。)

于 2013-08-22T15:01:46.777 回答
0

没有初始化任何控件的“AViewController”

因为这些控件的初始化都是属于view的,所以需要调用[viewController loadView]来初始化UI组件。

如果你还使用 viewDidLoad 函数来初始化一些 UI 组件,你必须调用 [viewController view] 来触发 viewDidLoad 函数。

于 2015-03-30T03:58:25.037 回答