2014-02-10 37 views
2

我有方法,我想测试:测试PresentedViewController与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作为presentedViewController但我有空。我不知道该怎么办。请帮忙!

+0

尝试'[mockViewController视图]',而不是viewDidLoad'的'。 – Fogmeister

+0

在[mockViewController视图]上更改[mockViewController viewDidLoad]没有帮助 – user2375706

回答

0

您的测试案例包含一些问题。 您正在从MailComposer提交MFMailComposeViewController。所以你应该拨打presentedViewControllermockMailComposer而不是mockViewController

修改成:

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

    [mockMailComposer sendMailToContact:[self mockContact]]; 

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

presentedViewController仍然没有 – user2375706

4

的问题是,mockViewControllerUIWindow层次。尝试:

​​

那么你也可以摆脱viewDidLoad通话。

+0

适用于我。谢谢! – nigong

0

它看起来好像你需要2部分到你的测试(或2个单独的测试)。第一部分应确保isSendingAvaiableNO并测试mockViewController.presentedViewControllernil。第二部分应确保isSendingAvaiableYES并测试mockViewController.presentedViewController是适当的类。

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

也许问题是isSendingAvaiableNO

1

这里的雨燕4溶液:

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

在您的测试...

XCTAssert(vc.presentedViewController is MyCustomViewController)