iOS Swift:为XCTest分离AppDelegate

时间:2015-01-13 19:36:34

标签: ios swift xctest

由于一些问题,我希望项目中的XCTest目标能够运行单独的应用程序委托。使用ObjC,这是一个相对简单的过程:操纵main.m(参见:https://stackoverflow.com/a/15725328/1299041)。

由于似乎在AppDelegate中使用@UIApplicationMain初始化了Swift应用程序,是否可以使用单独的AppDelegate为测试目标进行初始化?

2 个答案:

答案 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添加启动参数,表明这是测试运行 App Start execution

可以从NSUserDefaults

访问这些参数
#define IS_TESTS [[NSUserDefaults standardUserDefaults] boolForKey:@"TESTING"]

答案 1 :(得分:2)

这个解决方案如下:

  1. 复制现有应用程序的Target并将其重命名为适当的名称。在你的情况下可能是'TestingHarness'或其他一些。请注意,您还需要更改包标识符并重命名相应的Info.plist文件。重命名Info.plist文件意味着您需要更改新目标的Build Settings选项卡中的Info.plist文件名设置以匹配新名称。

  2. 创建另一个*AppDelegate.swift文件。在你的情况下,我称之为TestAppDelegate.swift

  3. 将现有的AppDelegate.swift文件内容复制到TestAppDelegate.swift并根据需要进行修改。请务必保留@UIApplicationMain注释并实施所需的UIApplicationDelegate回调。

  4. 更改每个*AppDelegate.swift文件的目标成员资格,以便AppDelegate.swift未包含在新的“TestHarness”目标中,并且TestAppDelegate.swift未包含在您的主应用中目标。 (您可以在文件浏览器中选择文件的目标成员资格并打开文件检查器,默认情况下可以在右侧栏中访问它,或者在View - > Utilities下的菜单中选择它。)

  5. 现在您有两个单独的目标,其中包含可以独立构建和运行的单独的App Delegates。最后一步是选择新的“TestHarness”目标作为测试目标的主机应用程序。 (单击文件浏览器中的顶级项目条目,然后在子列表中单击所需的测试目标。在常规选项卡上,您将看到主机应用程序是唯一可用的下拉列表。)

  6. 注意:这些说明适用于Xcode 7.2。