簡體   English   中英

使用XCTest測試PresentedViewController

[英]Test PresentedViewController with XCTest

我有方法,我想測試:

- (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,但我有null。 我不知道該怎么辦。 請幫忙!

問題是mockViewController不在UIWindow層次結構中。 嘗試:

[UIApplication sharedApplication].keyWindow.rootViewController = mockViewController;

然后你也可以擺脫viewDidLoad調用。

這是Swift 4解決方案:

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

在你的測試中......

XCTAssert(vc.presentedViewController is MyCustomViewController)

您的測試用例包含一些問題。 您將從MailComposer呈現MFMailComposeViewController 所以,你應該叫presentedViewControllermockMailComposer不是mockViewController

改為:

- (void)testSendMailToContact_itShouldShowMFMailComposeViewController
{
    MailComposer *mockMailComposer = [MailComposer sharedComposerWithController:mockViewController];

    [mockMailComposer sendMailToContact:[self mockContact]];

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

看起來你的測試需要2個部分(或2個單獨的測試)。 第一部分應確保isSendingAvaiableNO並測試mockViewController.presentedViewControllernil 第二部分應確保isSendingAvaiableYES並測試mockViewController.presentedViewController是否為適當的類。

當測試失敗時,確定故障是在測試代碼還是測試本身是很重要的。

也許問題是isSendingAvaiableNO

在測試之前將根ViewController實例添加到UIWindow,如上所述,不需要使用UIApplication.shared.keyWindow?.rootViewController

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


XCTAssert(yourRootViewController.presentedViewController is YourModalViewController)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM