在单元测试中以编程方式执行 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];

    (我尝试将发件人更改为nilvc.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的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式执行Unwind segue?

无法以编程方式执行 unwind segue

单元格子视图约束在 CellForRowAtIndex 中以编程方式更改

为啥在集合视图单元格中以编程方式创建的按钮需要是惰性变量?

在表格视图单元格中以编程方式显示图像

在 .net 中以编程方式解压缩文件