2016-01-20 11 views
0

测试时,我需要清除我的应用程序的ios钥匙串存储,然后在我的初始viewController的“viewDidLoad”中运行 初始化代码。这似乎发生在我有权访问的任何内容之前。事情我已经尝试:如何在测试期间清除IOS Keychain用于应用程序初始化

  1. 更换AppDelegate中有MockAppDelegate(不工作,因为最初的AppDelegate代码执行和打破了测试之前,我可以取代它)
  2. 在XCTest设置清除钥匙链() (当然)
  3. 清除钥匙扣每次测试后我的应用程序初始化之前(没有第一次测试工作)

如何清除钥匙串?我会想象在AppDelegate被初始化之前做到这一点最简单 - XCTest是否提供了任何方式来执行此操作?

任何帮助,非常感谢。谢谢!

+0

为什么,如果你指定一个MockAppDelegate并在AppDelegate中仍然执行? –

+0

似乎XCTest setup()函数运行得不够早,无法保持初始化代码的运行 - 我第一次更换AppDelegate的机会似乎是在应用程序初始化后才出现的,所以它将使用我的原始AppDelegate启动应用程序。 – lonesomewhistle

回答

1

http://qualitycoding.org/app-delegate-for-tests/

更换应用程序委托中main。如果您使用的Xcode 7.0,7.1或7.2,您必须在您的生产目标,测试应用程序的委托:

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 
#import "TestingAppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     BOOL isTesting = NSClassFromString(@"XCTestCase") != Nil; 
     Class appDelegateClass = isTesting ? [TestingAppDelegate class] : [AppDelegate class]; 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass)); 
    } 
} 

在Xcode的7.3,苹果已经固定的东西,这样的测试应用程序的委托可以住在测试目标所在地:

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     Class appDelegateClass = NSClassFromString(@"TestingAppDelegate"); 
     if (!appDelegateClass) 
      appDelegateClass = [AppDelegate class]; 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass)); 
    } 
} 

以下是一些人在Swift中如何做的。而不是创建一个TestingAppDelegate的,他们只是使用nil

import UIKit 

private func delegateClassName() -> String? { 
    return NSClassFromString("XCTestCase") == nil ? NSStringFromClass(AppDelegate) : nil 
} 

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, delegateClassName()) 

如需进一步讨论,请参见How to Easily Switch Your App Delegate for Testing

+0

啊!我多次遇到你的博客,每次都非常有帮助!任何想法,主要的Swift等价位置是什么? – lonesomewhistle

+0

@lonesomewhistle我添加了一个来自博客帖子讨论的Swift示例。 –

相关问题