从http://qualitycoding.org/app-delegate-for-tests/:
更换应用程序委托中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,苹果已经固定的东西,这样的测试应用程序的委托可以住在测试目标所在地:
#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
为什么,如果你指定一个MockAppDelegate并在AppDelegate中仍然执行? –
似乎XCTest setup()函数运行得不够早,无法保持初始化代码的运行 - 我第一次更换AppDelegate的机会似乎是在应用程序初始化后才出现的,所以它将使用我的原始AppDelegate启动应用程序。 – lonesomewhistle