使用XCTest测试PresentedViewController

use*_*706 5 iphone ios ios7 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

考试...

- (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]], @"");
}
Run Code Online (Sandbox Code Playgroud)

但它无法正常工作.我应该将MFMailComposeViewController作为presentViewController,但我有null.我不知道该怎么办.请帮忙!

Rud*_*vič 7

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

[UIApplication sharedApplication].keyWindow.rootViewController = mockViewController;
Run Code Online (Sandbox Code Playgroud)

然后你也可以摆脱viewDidLoad电话.


Sal*_*lmo 6

在测试之前将根 ViewController 实例添加到 UIWindow 中,无需UIApplication.shared.keyWindow?.rootViewController如上所述使用。

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


XCTAssert(yourRootViewController.presentedViewController is YourModalViewController)
Run Code Online (Sandbox Code Playgroud)


Mid*_* MP 0

您的测试用例包含一些问题。您正在呈现MFMailComposeViewController来自MailComposer. 所以你应该调用presentedViewControlleronmockMailComposer而不是 on mockViewController

将其更改为:

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

    [mockMailComposer sendMailToContact:[self mockContact]];

    XCTAssertTrue([mockMailComposer.presentedViewController isKindOfClass:[MFMailComposeViewController class]], @"");
}
Run Code Online (Sandbox Code Playgroud)