0

我正在尝试为我正在创建的 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 中?

4

2 回答 2

3

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

我的想法是钥匙串访问大概(我没有使用过)需要在正在运行的应用程序中进行。这两个设置是使 OCUnit 单元测试在应用程序进程中运行的原因(即,在 Apple 的术语中,使它们成为“应用程序测试”而不是“逻辑测试”)。

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

至于 Xcode 为何按原样运行测试:从我的测试来看,Xcode 似乎总是启动模拟器,并在主应用程序中运行测试,而不管包加载器和测试主机设置如何。根据Apple 的文档,我认为这是不正确的行为,但它似乎就是这样做的。

于 2012-08-16T07:14:00.610 回答
2

Here is the AppCode's forum discussion: http://devnet.jetbrains.net/message/5466009#5466009

于 2012-08-17T07:33:10.697 回答