使用KIF

时间:2015-08-05 14:06:18

标签: ios ui-testing kif

我正在使用KIF进行UI测试。我想要做的第一件事就是清理模拟器中可能存在的所有缓存数据。所以我在-beforeAll的{​​{1}}方法中编写了清理代码。但是在调用我的app delegate KIFTestCase方法后,此方法称为。此时为时已晚,我的应用已经在运行,并且已经使用了缓存数据。

我可以用-application:didFinishLaunchingWithOptions:之类的东西修改我的应用程序代码,但这对我来说似乎是一个糟糕的解决方案。

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

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

2 个答案:

答案 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];
  • 在app委托中,我们之前已为此通知注册了自己
[[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