【问题标题】:Is it possible to instantiate a View Controller from a Storyboard for Kiwi Testing是否可以从故事板实例化视图控制器以进行 Kiwi 测试
【发布时间】:2013-07-13 14:39:03
【问题描述】:

我正在测试 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 中找不到名为“MainStoryboard”的故事板/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/Developer/usr/bin >(加载)“提出

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

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

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

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

【问题讨论】:

  • 我能够以这种方式实例化故事板。实际上,我在测试目标或 Copy Bundle Resources 构建阶段包含故事板,但我只是尝试了两种方式,任何一种方式都适合我。
  • 谢谢,在玩弄之后,我成功地实例化了它。但是现在我被卡住了,然后我执行: [aVC performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];因为它导致:NSInvalidArgumentException "-[__NSCFType pointSize]:unrecognized selector sent to instance 0x21f4690"

标签: ios uiviewcontroller storyboard kiwi


【解决方案1】:

问题是你为你的包传递了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 名称和故事板标识符与类名称匹配。如果不匹配,请更改它。)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 2021-08-05
      • 2013-12-21
      • 1970-01-01
      • 2013-07-13
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多