2

我正在使用KIF进行 UI 测试。我要做的第一件事是清理模拟器中可能存在的所有缓存数据。所以我在-beforeAll我的KIFTestCase. 但是这个方法是在我的应用程序委托方法被调用之后-application:didFinishLaunchingWithOptions:调用的。此时为时已晚,我的应用程序已经在运行并且已经使用了缓存的数据。

我可以用类似的东西修改我的应用程序代码,if (NSClassFromString(@"KIFTestCase") { … })但这对我来说似乎是一个糟糕的解决方案。

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

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

4

2 回答 2

0

我可能会选择建议的解决方案之一(我们亲自检查NSClassFromString("XCTest") != nil

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

  • 创建AppDelegate包含所有测试逻辑的类的动态子类,并用于object_setClass(appDelegate, [TestAppDelegate class])更改实例类(您需要引用应用程序委托的实例)。
  • 或者简单地将问题中的方法混合起来,+[TestHelper load]以便在应用程序委托触发之前发生(可能会调用您在混合之前保留的原始实现)

希望能帮助到你!

于 2015-08-05T21:08:18.283 回答
0

从 KIF 测试用例中我知道,在应用程序委托方法-application:didFinishLaunchingWithOptions:运行之前执行设置工作没有直接的可能性。

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

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

  • NSNotificationCenter使用来自测试用例的通知来触发应用重置

[[NSNotificationCenter defaultCenter] postNotificationName:@"reset.app.state" object:self];
[测试人员 waitForTimeInterval:1.0];
  • 在应用程序委托中,我们之前已经为该通知注册了自己
[[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(resetAppState:) name:@"reset.app.state" object:nil];
  • 现在我们实现该resetAppState:方法,在这里我们再次实例化应用程序窗口和初始视图控制器。如有必要,我们还可以在此处执行其他设置任务。
- (void)resetAppState:(NSNotification*)通知
{
    NSLog(@"为 UI 测试重置应用状态");

    // 执行其他重置应用程序状态任务,例如清理缓存等

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *controller = [storyboard instantiateInitialViewController];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = 控制器;

    [self.window makeKeyAndVisible];
}

这种方法似乎工作得相当好。我可以使用它来截取不同语言的屏幕截图,从而设置应用程序语言并从测试用例重置应用程序状态。

我准备了一个示例项目来说明它是如何工作的: http ://extrabright.com/dl/ResetAppState.zip

于 2015-08-06T21:29:37.980 回答