2012-08-16 43 views
0

我正在尝试为我创建的iOS框架编写单元测试。在它的封面下,它使用了Nuance的Dragon Mobile SDK。当我在JetBrains公司AppCode运行我的单元测试,我得到这个错误:iOS单元测试失败 - 无法访问KeyChain

2012-08-15 17:43:48.874 otest[62547:707] *** Assertion failure in -[KeychainManager writeToKeychain], /checkout_120606-1556/NMSPClient/sdk/c/trunk/solutions/iPhone/NMSP/../../../source/oem/iphone/src/KeychainManager.m:285 

Couldn't add the Keychain Item. 
Unknown.m:0: error: -[NuanceVoiceRecognizerTest testExample] : Couldn't add the Keychain Item. 

当我运行Xcode中测试,它工作正常。实际上,XCode旋转模拟器来运行测试,而AppCode似乎并不需要。现在

中,Nuance的位是相关的原因是,它是正试图做的东西与钥匙串,当我把它的东西:

[SpeechKit setupWithID:@"<snip>" 
    host:@"sandbox.nmdp.nuancemobility.net" 
    port:443 
    useSSL:NO 
    delegate:self]; 

现在我知道这里一个答案是刚刚运行在XCode中测试。但是在XCode上我真的很难过,因为在代码编辑方面它有多么原始。更重要的是,我错过了一些关键概念,这令我很烦恼。

问题:什么可能会导致我的代码在单元测试运行时无法访问密钥库?任何人都会遇到这种事情,即使在XCode中也是如此?

回答

2

如果它们尚未设置,您可以尝试编辑单元测试目标的BUNDLE_LOADER和TEST_HOST构建设置,以指向您的应用程序包(可能类似于$(BUILT_PRODUCTS_DIR)/AppName.app/AppName)。

我在这里想到的是,假设(我没有使用它)钥匙串访问需要发生在一个正在运行的应用程序内。这两个设置是使OCUnit单元测试在应用程序进程中运行的(也就是说,使用Apple的术语,'应用程序测试'而不是'逻辑测试')。

在项目向导中由Xcode 设置的单元测试捆绑包被设置为应用程序测试,但随后添加的测试捆绑包是逻辑测试。如果您稍后添加了单元测试目标,则可能没有上述编译设置。至于为什么Xcode按原样运行测试:从我的测试看来,Xcode总是启动模拟器,并在主应用程序中运行测试,而不管bundle加载器和测试主机设置如何。根据Apple's documentation,我认为这是不正确的行为,但它似乎是它的作用。