【问题标题】:Test PresentedViewController with XCTest使用 XCTest 测试 PresentedViewController
【发布时间】:2014-03-07 12:30:28
【问题描述】:

我有想要测试的方法:

- (void)sendMailToContact:(Contact *)conact
{
    self.contact = conact;

    if ([self isSendingAvaiable]) {

        MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
        mailViewController.mailComposeDelegate = self;
        [mailViewController setToRecipients:@[self.contact.email]];

        [self.parentViewController presentViewController:mailViewController animated:YES completion:nil];
    }
}

测试...

- (void)testSendMailToContact_itShouldShowMFMailComposeViewController
{
    UIViewController *mockViewController = [[UIViewController alloc] init];
    [mockViewController viewDidLoad];

    MailComposer *mockMailComposer = [MailComposer sharedComposerWithController:mockViewController];

    [mockMailComposer sendMailToContact:[self mockContact]];

    XCTAssertTrue([mockViewController.presentedViewController isKindOfClass:[MFMailComposeViewController class]], @"");
}

但它不能正常工作。我应该有 MFMailComposeViewController 作为presentViewController,但我有空。我不知道该怎么办。请帮忙!

【问题讨论】:

  • 试试[mockViewController view]; 而不是viewDidLoad
  • 在 [mockViewController view] 上更改 [mockViewController viewDidLoad] 没有帮助

标签: ios iphone ios7 xctest


【解决方案1】:

在测试之前将你的根 ViewController 实例添加到 UIWindow,不需要像上面提到的那样使用UIApplication.shared.keyWindow?.rootViewController

let window = UIWindow()
window.rootViewController = yourRootViewController
window.makeKeyAndVisible()


XCTAssert(yourRootViewController.presentedViewController is YourModalViewController)

【讨论】:

    【解决方案2】:

    这是 Swift 4 解决方案:

    let vc = UIViewController()
    UIApplication.shared.keyWindow?.rootViewController = vc
    

    在你的测试中……

    XCTAssert(vc.presentedViewController is MyCustomViewController)
    

    【讨论】:

      【解决方案3】:

      问题是mockViewController 不在UIWindow 层次结构中。试试:

      [UIApplication sharedApplication].keyWindow.rootViewController = mockViewController;
      

      那么你也可以摆脱viewDidLoad的调用。

      【讨论】:

      • 为我工作。谢谢!
      【解决方案4】:

      看起来您的测试需要 2 个部分(或 2 个单独的测试)。第一部分应确保isSendingAvaiableNO 并测试mockViewController.presentedViewControllernil。第二部分应确保isSendingAvaiableYES 并测试mockViewController.presentedViewController 是否属于适当的类。

      当测试失败时,重要的是要确定错误是出在正在测试的代码还是出在测试本身。

      也许问题在于isSendingAvaiableNO

      【讨论】:

        【解决方案5】:

        您的测试用例包含一些问题。 您正在展示来自MailComposerMFMailComposeViewController。所以你应该在mockMailComposer而不是mockViewController上调用presentedViewController

        将其更改为:

        - (void)testSendMailToContact_itShouldShowMFMailComposeViewController
        {
            MailComposer *mockMailComposer = [MailComposer sharedComposerWithController:mockViewController];
        
            [mockMailComposer sendMailToContact:[self mockContact]];
        
            XCTAssertTrue([mockMailComposer.presentedViewController isKindOfClass:[MFMailComposeViewController class]], @"");
        }
        

        【讨论】:

        • presentedViewController 仍然为零
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 2014-12-25
        • 2013-12-27
        • 2013-10-23
        相关资源
        最近更新 更多