在单元测试中以编程方式执行Unwind Segue

时间:2014-02-28 06:39:25

标签: ios unit-testing segue

我正在尝试单独测试一个unwind segue。

但似乎在测试中,调用performSegueWithIdentifier:方法不执行展开segue而对其他类型的segue执行,例如Push和Modal segues。

基本上我要做的是以下内容:

  1. 从故事板中获取视图控制器。
  2. 使用以下代码行以编程方式执行展开segue:

    [vc performSegueWithIdentifier:@"unwind" sender:vc];

    (我尝试将发件人更改为nilvc.button,这是展开segue的触发按钮。但测试仍然失败。)

  3. 使用以下代码行检查视图控制器中的seguePerformed属性是否设置为YES:

    XCTAssertTrue(sut.seguePerfomed, @"should be true.");

    在这个视图控制器的- prepareForSegue:方法中,我使用segue的标识符来识别展开segue。如果是展开segue,则将视图控制器的seguePerformed属性设置为YES。

  4. 我认为我的performSegue代码存在问题。 但是,如果我将此行[vc performSegueWithIdentifier:@"unwind" sender:vc];复制到我的视图控制器的viewDidAppear方法中进行测试,并在iPhone模拟器中输入此视图。输入后它确实返回到之前的视图。

    很抱歉,我忘了提及我也尝试了以下代码段:

    - (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.");
    }
    

1 个答案:

答案 0 :(得分:0)

展开segue仅在实时上下文中有意义,因为它与实例有关,而与类无关。例如,如果我在View Controller A中启动并按下View Controller B,那么我可以展开,弹出到View Controller A - 不仅仅是任何View Controller A,而是我们开始使用的实例。

但是你只是将View Controller B拉出故事板并尝试放松。你不能,因为没有视图控制器A来放松。为了实现这一点,您必须完全按照我刚才描述的方式执行操作:从View Controller A开始,按下View Controller B,然后告诉 View Controller B要放松。