6

我有我想测试的方法:

- (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,但我有空。我不知道该怎么办。请帮忙!

4

5 回答 5

11

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

[UIApplication sharedApplication].keyWindow.rootViewController = mockViewController;

然后你也可以摆脱viewDidLoad呼叫。

于 2014-02-25T15:59:35.750 回答
2

在测试之前将你的根 ViewController 实例添加到 UIWindow,不需要UIApplication.shared.keyWindow?.rootViewController像上面提到的那样使用。

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


XCTAssert(yourRootViewController.presentedViewController is YourModalViewController)
于 2018-09-24T08:44:58.217 回答
2

这是 Swift 4 解决方案:

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

在你的测试中……</p>

XCTAssert(vc.presentedViewController is MyCustomViewController)
于 2018-01-23T19:22:06.193 回答
0

您的测试用例包含一些问题。您正在展示MFMailComposeViewControllerfrom MailComposer。所以你应该调用presentedViewControlleron mockMailComposernot on mockViewController

将其更改为:

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

    [mockMailComposer sendMailToContact:[self mockContact]];

    XCTAssertTrue([mockMailComposer.presentedViewController isKindOfClass:[MFMailComposeViewController class]], @"");
}
于 2014-02-10T09:18:38.390 回答
0

看起来您的测试需要 2 个部分(或 2 个单独的测试)。第一部分应确保isSendingAvaiableisNO并测试 that mockViewController.presentedViewControlleris nil。第二部分应确保它isSendingAvaiableYES并测试它mockViewController.presentedViewController是适当的类。

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

也许问题isSendingAvaiableNO

于 2015-09-20T13:41:23.807 回答