2012-08-16 51 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,我認爲這是不正確的行爲,但它似乎是它的作用。