如何在测试期间清除应用程序初始化之前的IOS Keychain

时间:2016-01-20 18:37:06

标签: ios iphone xcode swift xctest

测试时,我需要先清除我的应用程序的ios钥匙串商店 初始化代码在我的初始viewController" viewDidLoad中运行。"这似乎发生在我有权访问之前。我尝试过的事情:

  1. 使用MockAppDelegate替换AppDelegate(因为初始AppDelegate代码执行并且在我可以替换它之前中断测试,所以无法正常工作)
  2. 清除XCTest setup()中的钥匙串(当然)
  3. 每次测试后清除钥匙串(不适用于第一次测试)
  4. 如何在初始化应用程序之前清除钥匙串?我想在AppDelegate初始化之前最容易做到这一点 - XCTest是否提供了任何方法来做到这一点?

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

1 个答案:

答案 0 :(得分: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中的表现。他们只使用nil

而不是创建TestingAppDelegate
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