2010-02-10 58 views
1

我想爲我的iphone應用程序設置應用程序單元測試。所以我製作了一個應用程序目標的副本,以及蘋果的documentation中描述的單元測試包目標。iPhone單元測試鏈接問題,無法找到DevToolsBundleInjection.framework

在遵循Apple的指示之後,我無法在單元測試中引用我的類,因此我使用「Bundle Loader」構建設置將應用程序鏈接到單元測試包,並將主要目標設置爲導出符號。這解決了編譯時間錯誤,並且在我改變它之後立即運行並執行了我的測試。但是,一旦我清理和重新建造,我開始收到此錯誤,當我試圖在設備上運行:

Unable to read symbols for "/Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.1 (7C144)/Symbols/Developer/Library/PrivateFrameworks/DevToolsBundleInjection.framework/DevToolsBundleInjection" (file not found). 

該文件不存在,這是真的。我發現.framework文件在: /Xcode3.1.4/Library/PrivateFrameworks PrivateFrameworks

並做了一個符號鏈接。然後運行該應用程序說,它不能連接應用程序的文件:

010-01-25 20:19:22.330 SmokeyTheBear[5808:207] Error loading /private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests: dlopen(/private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests, 262): Symbol not found: _OBJC_CLASS_$_AppDelegate 
    Referenced from: /private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests 
    Expected in: /var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/UDorse 
in /private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests 
DevToolsBundleInjection: Error loading bundle '/private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest' 

然後,我切換回運行正常目標的應用程序,它跑了我所有的單元測試,並退出!我再次清理並建造,然後正常目標正常運行。單元測試目標仍然沒有工作。

+0

請您提供反饋意見嗎? – 2010-02-20 10:53:36

+0

@Johannes魯道夫:我同意。 – Goles 2010-02-22 12:09:30

回答

0

儘管這並沒有直接回答你的問題,但我想說我試着按照你的路線使用蘋果的單元測試信息,發現它是一種非最佳的TDD方法,所以我選擇使用其他人推薦的方法:

Google's Toolbox iPhoneUnitTesting Kit

UISpec for GUI unit testing

Tutorial如何得到這個運行和有關適用於iPhone的單元測試不同的選擇discusion。

我認爲蘋果公司提供的選項只能在模擬器模式下運行,並且還有許多其他缺點......對於不直接回答你的問題,但也許你可以用不同的角度來解決問題(比如我發佈的問題你在這裏 )。

2

從給出的日誌消息中,我假設你正試圖設置一個「邏輯測試」 (很尷尬,不是嗎?)。你的問題是,當你需要將它包含在testbundle中時,你試着鏈接到你的待測代碼。這裏是manual的相關部分(重點介紹我的)。

爲測試條件下訪問對象 API,你可能不得不添加 合適的實現文件 的單元測試包和 相應的頭文件導入到 單元測試類。有關使用單元測試的 項目的示例,請參閱 iPhoneUnitTests示例代碼項目。

我發現OCUnit的單元測試設置也是次優體驗。單元測試根本不是Obj-C世界的一流實踐,至少從Apple提供的是什麼。 OCTest是SenTestingKit的定製版本。基本上它會創建一個OCTest runner(otest)執行擴展名爲.octest的庫。在iPhone上不支持動態鏈接(更好的措辭:允許),所以這就是爲什麼您只能在Mac上運行測試的原因。

這就是「邏輯測試」的簡單情況,「應用測試」有點複雜。 OCUnit的工作方式會導致各種各樣的痛苦,特別是在調試時。 這就是爲什麼我和其他許多人選擇了OCTest並選擇GTM或GHUnit。他們通過靜態鏈接工作,並將測試運行者包含在測試目標本身中。 (有點類似於「應用測試」。)

+0

哦,順便說一句,如果有什麼不清楚的地方,你應該真的看看示例項目。 – 2010-02-17 11:36:18