【问题标题】:How to Clear IOS Keychain for before App Initialization During Tests如何在测试期间在应用程序初始化之前清除 IOS 钥匙串
【发布时间】:2016-04-26 18:16:00
【问题描述】:

测试时,我需要先清除我的应用程序的 ios 钥匙串存储区 初始化代码在我的初始 viewController 的“viewDidLoad”中运行。这似乎发生在我可以访问的任何内容之前。我尝试过的事情:

  1. 用 MockAppDelegate 替换 AppDelegate(不起作用,因为初始 AppDelegate 代码在我替换它之前执行并中断了测试)
  2. 在 XCTest setup() 中清除钥匙串(当然)
  3. 每次测试后清除钥匙串(不适用于第一次测试)

如何在我的应用程序初始化之前清除钥匙串?我想在 AppDelegate 初始化之前这样做是最简单的——XCTest 是否提供任何方法来做到这一点?

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 如果指定了 MockAppDelegate,为什么 AppDelegate 仍然执行?
  • 似乎 XCTest setup() 函数运行得不够早,无法阻止初始化代码运行——我第一次替换 AppDelegate 的机会似乎是在应用程序初始化之后出现的,所以它正在启动带有我原来的 AppDelegate 的应用程序。

标签: ios iphone xcode swift xctest


【解决方案1】:

来自https://qualitycoding.org/ios-app-delegate-testing/

替换main 中的应用委托。如果您使用的是 Xcode 7.0、7.1 或 7.2,则必须在生产目标中包含测试应用委托:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "TestingAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        BOOL isTesting = NSClassFromString(@"XCTestCase") != Nil;
        Class appDelegateClass = isTesting ? [TestingAppDelegate class] : [AppDelegate class];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass));
    }
}

在 Xcode 7.3 中,Apple 修复了一些问题,以便测试应用程序委托可以存在于它所属的测试目标中:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        Class appDelegateClass = NSClassFromString(@"TestingAppDelegate");
        if (!appDelegateClass)
            appDelegateClass = [AppDelegate class];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass));
    }
}

以下是一些人在 Swift 中的做法。他们没有创建TestingAppDelegate,而是使用nil

import UIKit

private func delegateClassName() -> String? {
    return NSClassFromString("XCTestCase") == nil ? NSStringFromClass(AppDelegate) : nil
}

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, delegateClassName())

更多讨论请见How to Easily Switch Your App Delegate for Testing

【讨论】:

  • 啊!我多次访问您的博客,每次都非常有帮助!知道 main 的 Swift 等效位置在哪里吗?
  • @lonesomewhistle 我添加了一个取自博文讨论的 Swift 示例。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多