iOS单元测试失败 - 无法访问KeyChain

时间:2012-08-16 01:08:46

标签: ios xcode testing keychain appcode

我正在尝试为我正在创建的iOS框架编写单元测试。在幕后它使用Nuance的Dragon Mobile SDK。当我在Jetbrains的AppCode中运行我的单元测试时,我收到此错误:

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 个答案:

答案 0 :(得分:3)

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

我的想法是,钥匙串访问可能(我还没有使用过)需要在正在运行的应用程序中发生。这两个设置使得OCUnit单元测试在应用程序进程中运行(即,使用Apple的术语,'应用程序测试'而不是'逻辑测试')来制作它们。

项目向导中由Xcode 设置的单元测试包被设置为应用程序测试,但随后添加的测试包是逻辑测试。如果您稍后添加了单元测试目标,则可能没有上述构建设置。

至于为什么Xcode按原样运行测试:从我的测试来看,似乎Xcode总是激活模拟器,并在主应用程序中运行测试,无论捆绑加载器和测试主机设置如何。根据{{​​3}},我认为这是不正确的行为,但它似乎就是它的作用。

答案 1 :(得分:2)

以下是AppCode的论坛讨论:http://devnet.jetbrains.net/message/5466009#5466009