從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