在单元测试中以编程方式执行 Unwind Segue
Posted
技术标签:
【中文标题】在单元测试中以编程方式执行 Unwind Segue【英文标题】:Perform Unwind Segue Programatically in Unit Test 【发布时间】:2014-02-28 06:39:25 【问题描述】:我正在尝试对 unwind segue 进行单元测试。
但似乎在测试中调用performSegueWithIdentifier:
方法不会执行展开转场,而它对其他类型的转场(例如Push 和 Modal segues。
基本上我想做的是以下几点:
-
从情节提要中获取视图控制器。
使用这行代码以编程方式执行展开转场:
[vc performSegueWithIdentifier:@"unwind" sender:vc];
(我尝试将发件人更改为nil
和vc.button
,这是展开segue的触发按钮。但测试仍然失败。)
用这行代码检查视图控制器中的seguePerformed
属性是否设置为YES:
XCTAssertTrue(sut.seguePerfomed, @"should be true.");
在这个视图控制器的- prepareForSegue:
方法中,我使用segue 的标识符来标识展开segue。如果是展开转场,则将视图控制器的 seguePerformed 属性设置为 YES。
我认为我的performSegue
代码有问题。
但是,如果我将此行 [vc performSegueWithIdentifier:@"unwind" sender:vc];
复制到我的视图控制器的 viewDidAppear
方法中进行测试,然后在 iPhone 模拟器中输入此视图。进入后它确实会返回到之前的视图。
对不起,我忘了提到我还尝试了以下sn-p:
- (void)testPerformingSegueShouldSetSeguePerform
// given
UINavigationController *nvVC = [sut.storyboard instantiateViewControllerWithIdentifier:@"nvVC"];
[nvVC pushViewController:sut animated:NO];
sut = (NTDSubViewController *)nvVC.topViewController;
// when
[sut performSegueWithIdentifier:@"unwind" sender:sut.button];
// then
XCTAssertTrue(sut.seguePerfomed, @"should be true.");
【问题讨论】:
我试图断言 NavigationController 状态的变化。奇怪的是,viewControllers
计数没有改变,topViewController
也没有改变。即使在模拟器中,要立即看到目标 VC 中的这些变化也需要不止一次的 unwind 调用。虽然不知道缺少什么。你有运气吗?
【参考方案1】:
unwind segue 仅在实时上下文中才有意义,因为它与实例有关,而不是与类有关。例如,如果我从 View Controller A 开始并推送 View Controller B,那么我可以放松,弹出到 View Controller A - 不仅仅是任何 View Controller A,而是我们开始使用的那个实例。
但您只是将视图控制器 B 拉出情节提要并试图放松。你不能因为没有 View Controller A 可以放松。为此,您必须完全按照我刚刚描述的方式进行操作:从 View Controller A 开始,推送到 View Controller B,然后告诉 那个 View Controller B 放松。
【讨论】:
对不起,我忘了提到我也试图把它放在上下文中。请查看我刚刚在原始帖子中添加的代码。谢谢。 :D以上是关于在单元测试中以编程方式执行 Unwind Segue的主要内容,如果未能解决你的问题,请参考以下文章