2011-06-07 91 views
18

注意:「使用GHUnit」不是此問題的可接受答案。我知道大多數人認爲GHUnit比Xcode4 OCUnit更好,但這不是我所問的。我會分開評估。Xcode 4單元測試鏈接器錯誤

我有一個從頭開始在Xcode4中創建的Xcode項目,在創建過程中選中「包含單元測試」複選框。我還包括一些我在以前的項目中開發的庫。通過「添加文件到x ...」對話框將它們添加到項目中,並僅添加到應用程序目標(而不是測試目標)。運行應用程序時它們工作正常,所以我認爲它們設置正確。我也爲這個項目編寫了許多不同的類。

我的測試文件是以標準方式設置的,名爲[AppName] Tests.h和.m。
代碼頭:
#import <SenTestingKit/SenTestingKit.h>

@interface [AppName]Tests : SenTestCase { 
@private 
} 
@end 

代碼執行:
#import "[AppName]Tests.h"

@implementation [AppName]Tests 

- (void)setUp 
{ 
    [super setUp]; 
    // Set-up code here. 
} 

- (void)tearDown 
{ 
    // Tear-down code here. 
    [super tearDown]; 
} 
// Test methods go here 
@end 

這僅僅是基本骨架。它可以在我的其他項目以及這個項目中正常工作,只要我不導入任何其他文件。當我從這個項目導入另一個文件,並使用它,我看到的Xcode輸出日誌以下錯誤:
The test bundle at /Users/[Me]/Library/Developer/Xcode/DerivedData/[AppName]-dwuuuwcpmdqxqmgxomoniplwhlpb/Build/Products/Debug-iphonesimulator/[AppName]Tests.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.

我已經證實:

  1. 我所用有框架被 添加到「鏈接二進制與 庫」爲應用程序和測試 目標。
  2. 測試目標已經配置 正確地創建和我所有的 測試方法編輯顯示 計劃...->測試 - >測試
  3. 每一個問題,但這個已經 解決,有沒有編譯器 錯誤。
  4. 所有設置討論 here 設置是否正確和一致 我認爲正確的測試 其他項目。

有什麼想法可能會導致這種情況?

+1

我有這個EXACT相同的問題。測試運行正常,直到您從主機應用程序分配一個對象。整天被難住:( – Sam 2011-07-28 16:42:21

+0

@Sam我被困了一個半月:P 最終我放棄了,並測試了老式的方式。也許新的Xcode會修復它,誰知道。 – Kongress 2011-07-28 19:59:40

+0

與我之前的許多人一樣,我已經放棄了,現在正在使用GHUnit,花費了大約10分鐘的時間來設置 – Sam 2011-07-29 10:27:53

回答

4

當我得到運行單元測試的鏈接器錯誤時,有兩件事情爲我解決了這個問題。第一種解決方案是將Build After Build構建設置設置爲YES,然後選擇Product> Build For> Build For Testing以運行測試。這個解決方案更容易實現。

第二種解決方案是將應用程序的實現文件添加到單元測試目標。選擇「視圖」>「實用程序」>「文件檢查器」打開文件檢查器。在項目導航器中選擇一個實現文件。選中文件檢查器中單元測試目標旁邊的複選框。

對於在模擬器中運行的iPhone應用程序,請確保測試主機構建設置爲空。該模擬器不支持應用程序託管的單元測試。

+0

感謝您的建議,但不幸的是,這些技術都沒有解決問題。最終結果與之前的鏈接器錯誤一樣 我想可能是考慮替代方案的時候了...... – Kongress 2011-06-08 12:52:41

+0

@Kongress ......如果這個答案沒有用,那你爲什麼接受它呢?找到一個解決方案? – PengOne 2011-06-20 05:02:08

+0

@PengOne這個問題已經坐了幾個星期了,這是我得到的唯一回應,儘管它沒有解決我的具體問題,它是徹底的和有益的。從SO常見問題解答中:「當你決定哪個答案對你最有幫助時,將其標記爲已接受的答案......」關於等待這個問題需要多長時間沒有明確的指導方針,所以我採取了主動。如果我處理了這個錯誤,請讓我知道以備將來參考。 – Kongress 2011-06-21 13:10:27

0

確保測試目標已將應用程序目標配置爲依賴項(構建階段 - >目標依賴項)。

+0

檢查。依賴關係似乎配置正確。 – Kongress 2011-06-22 19:04:21

1

我曾經有過同樣的問題。出於某種原因,我的項目的一個源文件也包含在測試目標中,這會導致此鏈接錯誤。

通過確保只編譯測試實現文件,您應該能夠解決此錯誤。你可以檢查此:

TestTarget - >構建階段 - >編譯源代碼

+0

優秀的答案。這解決了編譯單元測試包時遇到的一個問題。 – 2012-06-30 19:26:57

+0

我不得不採取恰恰相反的方向:只有在將項目中的所有源文件添加到測試目標後,鏈接器錯誤纔會消失。從目標中刪除任何源文件會使鏈接器錯誤重新出現。 – 2012-09-13 18:45:14

7

我只是浪費就這個問題和類似的錯誤小時 - 原來我已經改名爲我的主要目標 - 試圖通過重命名相關解決這個問題變量以及刪除整個DerivedData目錄都不成功。

我最終只是建立了一個新的單元測試目標追隨這裏的步驟: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

而現在一切都很好。

所以 - 如果你有奇怪的,莫名其妙的鏈接錯誤,你可能更好的是創建一個新的單元測試目標。只需要2分鐘。

+0

如果我再次回到那個項目/平臺,我將不得不嘗試一下。 – Kongress 2012-03-06 20:29:20

+0

謝謝!我浪費了幾個小時,最終這個簡單的解決方案爲我工作。 – 2015-08-24 23:16:04

0

我知道這個問題是相當古老的,但我只是在相同的問題上奮鬥了一段時間,最終設法解決它,所以讓我分享我發現的東西。

我一直在將應用程序從iOS移植到Mac,項目本身是爲iOS創建的,因此項目和主目標在支持的平臺上都有iOS。現在,當我開始移植時,我爲Mac創建了新的目標,並將支持的平臺更改爲僅針對該目標的OSX。之後,我爲單元測試創​​建了另一個目標,但忘了將支持的平臺從iOS更改爲Mac。我認爲你已經應該知道問題是什麼,基本上單元測試的目標是默認與Cocoa框架相連,因爲這個目標的支持平臺只有iOS,可可框架從來沒有建立過,沒有正確的鏈接。將受支持的平臺更改爲測試目標的OSX可解決該問題。

我知道這對iOS測試目標可能不是很有幫助,但至少要到您的測試目標鏈接Binary With Libraries部分,看看是否有任何紅色庫。這給了我這個想法,也許它也會幫助你們中的一些人。

13

我必須將單元測試目標上的「測試主機」屬性設置爲$(BUNDLE_LOADER)。這解決了我的問題!

+0

我*沒有*有這個設置,並且設置它似乎是這樣做的。它在iOS模擬器中啓動應用程序,而它運行測試,這似乎很奇怪......但現在我的測試實際運行。 – 2012-09-18 15:52:44

7

我做了以下內容:
http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

Test_Hosts = $(BUNDLE_LOADER)

設置完全相同固定同一問題的Test_Hosts採取從深層次看!

+0

優秀的鏈接。真正有價值的信息。 – Andrew 2013-01-03 21:25:42

+0

我的TEST_HOSTS路徑的雙引號失敗,我的TEST_HOSTS路徑周圍的單引號失敗,NO引號無效。順便說一下,我的系統中沒有空間。 – 2013-05-13 09:06:55

+1

讀這篇文章解決了我的問題。構建設置選項卡應該將Bundle Loader設置設置爲您的應用程序名稱: '$(BUILT_PRODUCTS_DIR)/ MyExistingApp.app/MyExistingApp' – 2013-10-04 22:50:09

1

遇到此錯誤運行Xcode 4.5.2 - 這是2012年11月 - 以上都無法工作。似乎設置bundle loader和測試主機應該爲你的項目填充所有的依賴關係 - 或者在應用程序的環境中運行測試,但不幸的是,它不適合我。它所做的是防止關於哪些文件/庫丟失的特定Xcode警告。

對我來說,增加了一個新目標:cocoa touch unit test(確保bundle loader和test host build設置爲空),觀察構建錯誤並手動添加缺失的依賴關係 - 一個接一個我的項目中需要的源文件,然後是框架。不是很優雅,但我很樂意讓它工作。不知道爲什麼我還沒有嘗試過這個GHUnit庫。

0

最近幾次合併後,我遇到了這種情況,我和同事都將文件添加到項目中,而不是所有的實現文件都是單元測試目標的成員。

解決辦法:

  1. 選擇一個小範圍的.m文件(使用 「在導航器」(CMD-OPT-J)搜索.m
  2. 顯示文件檢查器(CMD-OPT -1)查看文件的目標成員資格
  3. 確保相應的文件是測試目標的成員。

注:如果測試目標複選框顯示-代替+或做選擇,這意味着一些,但不是全部,所選文件是目標中的一員。

我試過在合併時與.xcodeprojproject.pbxproj文件做了更多的智能事情,但是我每次都因爲它的不可思議性而沮喪,並放棄了這種方法。

(另注:我只有一次選擇幾個文件,原因有二:

  • 選擇超過7-10文件時,Xcode的該文件檢查器性能差
  • 某些文件麥凱納t並且不應該是測試目標的成員,並且當選擇的範圍很小時更容易進行消除的過程)