KIF就像魔术一样,最近让我感到很困惑。这就是KIF和XCTest的确切运作方式。
在WWDC 2014& 2013:测试代码作为插件注入主机应用程序,那么哪些信息可以作为插件从主应用程序中窃听? 主机应用程序和&之间的关系是什么?的插件 ...
使用KIF,我们可以感知通知& URL请求,但是如何工作?我的第一个想法是主机应用程序中的所有上下文都与插件共享但是为什么在测试中,我们无法修改主应用程序中的变量?
例如:
我们有两个目标:
魔术项目
- MagicApp
- MagicUITest< - KIFTest目标
假设我有一个名为MagicClass的文件:
class MagicClass {
static var a = 1
}
如果我想在MagicUITest中修改该变量,那可能吗?
我现在遇到的问题是如何将不同的UIViewController注入到RootViewController中,以便我可以从每个单独的ViewController运行KIF测试,并且不需要经常一直通过登录过程...我的猜测是类似的:
在MagicApp中:
class AppDelegate : .. , .. {
func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
if MagicClass.a == 1 {
window.rootViewController = AViewController()
} else {
window.rootViewController = BViewController()
}
}
}
在KIFTest的setUp()中:
setUp() {
Magic.a = 2
}
但是没有工作......
有一件事是Magic.a = 2不会改变MagicApp中的Magic.a,第二是应用(..,..,..)函数将在调用setUp()之前结束。
有什么想法吗?
答案 0 :(得分:3)
虽然你说的确切的代码是行不通的,但你可以使用非常类似的方法。
例如,这段代码直接来自我正在处理的应用程序中的一个名为RootViewController
的应用程序(你猜对了)应用程序的根视图控制器:
public override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if NSProcessInfo.processInfo().environment["TESTING"] == nil {
loadChildren()
}
}
它的作用是寻找一个环境变量来决定它是否应该自动继续加载应用程序,如果找到环境变量,它会等待测试堆栈完成设置并告诉它应用程序的哪个部分加载下一个。 (如果它是一个非常小的应用程序,你也可以在你的应用程序委托中执行此操作。)
您可以通过在Xcode中编辑方案来设置环境变量:
尽管如此:使用这种策略时要小心。您希望您的测试测试应用程序中存在的应用程序功能,如果您的应用程序显示不同的屏幕是您的应用程序的一项功能,那可能没问题。但是如果你开始编写使你的应用程序在测试时表现不同的代码,你就不再测试你的应用了,是吗?