我正在使用KIF进行UI测试。我想要做的第一件事就是清理模拟器中可能存在的所有缓存数据。所以我在-beforeAll
的{{1}}方法中编写了清理代码。但是在调用我的app delegate KIFTestCase
方法后,此方法称为。此时为时已晚,我的应用已经在运行,并且已经使用了缓存数据。
我可以用-application:didFinishLaunchingWithOptions:
之类的东西修改我的应用程序代码,但这对我来说似乎是一个糟糕的解决方案。
在我的应用代码执行之前,是否有一种干净的方法来执行某些设置代码?
请注意,我不能使用Xcode的新内置UI测试功能,因为我想在iOS 8上运行测试。
答案 0 :(得分:0)
我可能会使用其中一个建议的解决方案(我们亲自检查NSClassFromString("XCTest") != nil
)
但如果两种解决方案都不适合您,并且您不介意某些运行时魔术,您可以:
AppDelegate
类的动态子类,并使用object_setClass(appDelegate, [TestAppDelegate class])
更改实例类(您需要引用应用程序委托的实例)。 +[TestHelper load]
中调整问题中的方法,以便在应用程序委托授权之前发生(可能会调用您在调配之前保留的原始实现)希望它有所帮助!
答案 1 :(得分:0)
在KIF测试用例中,我没有直接知道在应用委托方法-application:didFinishLaunchingWithOptions:
运行之前进行设置工作。
另一方面,您可以从测试用例中触发应用程序重置。我这样做的方式如下:
从KIF测试用例进行设置工作(例如,更改活动语言或设置一些特殊的NSUserDefaults属性)。
使用NSNotificationCenter
从测试用例发送通知,以触发重置应用
[[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];
resetAppState:
方法,我们再次实例化应用程序窗口和初始视图控制器。如有必要,我们还可以在此处执行其他设置任务。- (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]; }
这种方法似乎运作得相当好。我能够使用它,例如以不同语言截取屏幕截图,从而设置应用程序语言并从测试用例中重置应用程序状态。
我准备了一个示例项目来说明它是如何工作的: http://extrabright.com/dl/ResetAppState.zip