2014-02-10 40 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)