![](/img/trans.png)
[英]XCTest how to perform segue that present a modal view and test 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
。 所以,你應該叫presentedViewController
上mockMailComposer
不是mockViewController
。
改為:
- (void)testSendMailToContact_itShouldShowMFMailComposeViewController
{
MailComposer *mockMailComposer = [MailComposer sharedComposerWithController:mockViewController];
[mockMailComposer sendMailToContact:[self mockContact]];
XCTAssertTrue([mockMailComposer.presentedViewController isKindOfClass:[MFMailComposeViewController class]], @"");
}
看起來你的測試需要2個部分(或2個單獨的測試)。 第一部分應確保isSendingAvaiable
為NO
並測試mockViewController.presentedViewController
為nil
。 第二部分應確保isSendingAvaiable
為YES
並測試mockViewController.presentedViewController
是否為適當的類。
當測試失敗時,確定故障是在測試代碼還是測試本身是很重要的。
也許問題是isSendingAvaiable
是NO
。
在測試之前將根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.