如何在测试期间清除应用程序初始化之前的 IOS 钥匙串
How to Clear IOS Keychain for before App Initialization During Tests
测试时,我需要在
初始化代码在我的初始 viewController 中运行 "viewDidLoad." 这似乎发生在我可以访问的任何内容之前。我尝试过的事情:
- 用 MockAppDelegate 替换 AppDelegate(不起作用,因为初始 AppDelegate 代码在我替换它之前执行并中断了测试)
- 清除 XCTest setup() 中的钥匙串(当然)
- 每次测试后清除钥匙串(不适用于第一次测试)
如何在我的应用程序初始化之前清除钥匙串?我认为在初始化 AppDelegate 之前执行此操作最简单——XCTest 是否提供任何方法来执行此操作?
非常感谢任何帮助。谢谢!
来自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
测试时,我需要在 初始化代码在我的初始 viewController 中运行 "viewDidLoad." 这似乎发生在我可以访问的任何内容之前。我尝试过的事情:
- 用 MockAppDelegate 替换 AppDelegate(不起作用,因为初始 AppDelegate 代码在我替换它之前执行并中断了测试)
- 清除 XCTest setup() 中的钥匙串(当然)
- 每次测试后清除钥匙串(不适用于第一次测试)
如何在我的应用程序初始化之前清除钥匙串?我认为在初始化 AppDelegate 之前执行此操作最简单——XCTest 是否提供任何方法来执行此操作?
非常感谢任何帮助。谢谢!
来自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