![](/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.