由于一些问题,我希望项目中的XCTest目标能够运行单独的应用程序委托。使用ObjC,这是一个相对简单的过程:操纵main.m
(参见:https://stackoverflow.com/a/15725328/1299041)。
由于似乎在AppDelegate中使用@UIApplicationMain
初始化了Swift应用程序,是否可以使用单独的AppDelegate为测试目标进行初始化?
答案 0 :(得分:13)
强烈建议在正常的代码检查中添加条件,如果它正在测试。相反,你应该在测试中嘲笑你的AppDelegate
来做你想做的事。
然后你可以在每个setUp
的超类中替换UIApplication的委托XCTestCase
。
class MockAppDelegate:NSObject, UIApplicationDelegate {
}
class BaseTest: XCTestCase {
override func setUp() {
super.setUp()
UIApplication.shared.delegate = MockAppDelegate()
}
}
class Test1: BaseTest {
override func setUp() {
super.setUp()
// normal testing
}
}
如果您仍想停止测试的代码执行,这是我的方法运作良好:
您可以向app添加启动参数,表明这是测试运行
可以从NSUserDefaults
#define IS_TESTS [[NSUserDefaults standardUserDefaults] boolForKey:@"TESTING"]
答案 1 :(得分:2)
这个解决方案如下:
复制现有应用程序的Target并将其重命名为适当的名称。在你的情况下可能是'TestingHarness'或其他一些。请注意,您还需要更改包标识符并重命名相应的Info.plist文件。重命名Info.plist文件意味着您需要更改新目标的Build Settings选项卡中的Info.plist文件名设置以匹配新名称。
创建另一个*AppDelegate.swift
文件。在你的情况下,我称之为TestAppDelegate.swift
。
将现有的AppDelegate.swift
文件内容复制到TestAppDelegate.swift
并根据需要进行修改。请务必保留@UIApplicationMain
注释并实施所需的UIApplicationDelegate
回调。
更改每个*AppDelegate.swift
文件的目标成员资格,以便AppDelegate.swift
未包含在新的“TestHarness”目标中,并且TestAppDelegate.swift
未包含在您的主应用中目标。 (您可以在文件浏览器中选择文件的目标成员资格并打开文件检查器,默认情况下可以在右侧栏中访问它,或者在View - > Utilities下的菜单中选择它。)
现在您有两个单独的目标,其中包含可以独立构建和运行的单独的App Delegates。最后一步是选择新的“TestHarness”目标作为测试目标的主机应用程序。 (单击文件浏览器中的顶级项目条目,然后在子列表中单击所需的测试目标。在常规选项卡上,您将看到主机应用程序是唯一可用的下拉列表。)
注意:这些说明适用于Xcode 7.2。