Ios 使用KIF设置应用程序环境

Ios 使用KIF设置应用程序环境,ios,ui-testing,kif,Ios,Ui Testing,Kif,我用它来做UI测试。我想做的第一件事是清理模拟器中可能存在的所有缓存数据。因此,我在我的KIFTestCase的-beforeal方法中编写了清理代码。但是,在调用我的应用程序委托-application:didfishlaunchwithoptions:方法之后,将调用此方法。现在已经太晚了,我的应用程序已经在运行,并且已经使用了缓存的数据 我可以用if(NSClassFromString(@“KIFTestCase”){…})之类的东西修改我的应用程序代码,但这看起来是一个糟糕的解决方案 在

我用它来做UI测试。我想做的第一件事是清理模拟器中可能存在的所有缓存数据。因此,我在我的
KIFTestCase
-beforeal
方法中编写了清理代码。但是,在调用我的应用程序委托
-application:didfishlaunchwithoptions:
方法之后,将调用此方法。现在已经太晚了,我的应用程序已经在运行,并且已经使用了缓存的数据

我可以用
if(NSClassFromString(@“KIFTestCase”){…})之类的东西修改我的应用程序代码,但这看起来是一个糟糕的解决方案

在执行我的应用程序代码之前,是否有一种干净的方法来执行一些设置代码


请注意,我无法使用Xcode的新内置UI测试功能,因为我想在iOS 8上运行测试。

我可能会选择其中一种建议的解决方案(我们个人检查
NSClassFromString(“XCTest”)!=nil

但是,如果两种解决方案都不适合您,并且您不介意一些运行时魔法,那么您可以:

  • 创建包含所有测试逻辑的
    AppDelegate
    类的动态子类,并使用
    object\u setClass(AppDelegate,[TestAppDelegate class])
    更改实例类(您需要有对应用程序委托实例的引用)
  • 或者干脆在
    +[TestHelper load]
    中的问题中快速切换方法,这样在启动应用程序委派之前就会发生(可能会调用在快速切换之前保留的原始实现)

希望有帮助

据我所知,在KIF测试用例中,没有直接的可能性在应用程序委托方法运行之前进行设置工作
-应用程序:didfishLaunchingwithoptions:
运行

另一方面,您可以从测试用例触发应用程序重置。我的做法如下:

  • 从KIF测试用例执行设置工作(例如,更改活动语言或设置一些特殊的NSUserDefaults属性)

  • 使用测试用例中的
    NSNotificationCenter
    发送通知,以触发应用程序重置

这种方法似乎相当有效。我能够使用它,例如,以不同的语言拍摄屏幕截图,从而设置应用程序语言,并从测试用例中重置应用程序状态

我准备了一个示例项目来说明它是如何工作的:

我通常在AppDelegate上使用
#ifdef kifxctest
,它被定义为预处理器宏。如果链接断开,您可以重新上传示例吗? [[NSNotificationCenter defaultCenter] postNotificationName:@"reset.app.state" object:self]; [tester waitForTimeInterval:1.0]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resetAppState:) name:@"reset.app.state" object:nil]; - (void)resetAppState:(NSNotification*)notification { NSLog(@"Reset app state for UI-Tests"); // do other reset app state tasks, e.g. clean the caches & the like UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *controller = [storyboard instantiateInitialViewController]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = controller; [self.window makeKeyAndVisible]; }