2010-05-05 39 views
15

我遇到了一個問題,我想確認我正在以正確的方式做事。Xcode單元測試 - 從應用程序的包中訪問資源?

我可以用我的SenTestingKit測試測試簡單的東西,而且工作正常。我建立了一個單元測試包,並將其設置爲主應用程序目標的依賴關係。無論何時按下cmd + B,它都會成功運行所有測試。

這是我遇到的問題。我有一些XML文件需要作爲應用程序的一部分從資源文件夾加載。作爲一個好的單元測試人員,我想寫一些單元測試,以確保它們正確加載。

所以我有一些代碼,看起來像這樣:

NSString *filePath = [[NSBundle mainBundle] 
    pathForResource:@"foo" ofType:@"xml"]; 

這工作,當應用程序運行,但一個單元測試過程中,mainBundle指向錯誤的包,所以這行代碼返回零。

因此,我改變它利用一個已知的類是這樣的:

NSString *filePath = [[NSBundle bundleForClass:[Config class]] 
    pathForResource:@"foo" ofType:@"xml"]; 

這也不起作用,因爲爲了進行測試,甚至編譯這樣的代碼,它Config需要將一部分的單元測試目標。如果我補充一點,那麼該類的包就變成了單元測試包。 (呃!)

我接近這個錯誤的方式嗎?

+0

嘗試構建它,然後運行測試。我在上面看到了一個iTunes U視頻,他們說如果測試目標沒有正確設置,它會在運行時測試上一個版本,而不是構建然後運行測試。 您是否檢查過以確保不是這種情況? – Tacoman667 2010-05-05 17:51:24

+0

嘗試構建單元測試項目?部分單元測試包是運行腳本,所以我將它設置爲應用程序目標的依賴項。 CMD + B應該始終運行測試。 – 2010-05-05 17:53:19

回答

20

在試圖重現您的問題時,它碰到了我:您是否嘗試過將您的資源添加到測試包中?這會給你帶來什麼問題嗎?我確實做到了,而且對我來說非常好。例如:

代碼:

- (void)testBundleLoading { 
    NSLog(@"Main Bundle Path: %@", [[NSBundle mainBundle] bundlePath]); 

    for (NSBundle *bundle in [NSBundle allBundles]) { 
    NSLog(@"%@: %@", [bundle bundleIdentifier], 
        [bundle pathForResource:@"fire" ofType:@"png"]); 
    } 
} 

輸出:

2010-05-05 14:31:05.961 otest[16970:903] Main Bundle Path: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin 
2010-05-05 14:31:05.962 otest[16970:903] (null): (null) 
2010-05-05 14:31:05.963 otest[16970:903] com.freetimestudios.KayakKingTests: /Volumes/FreeTime/KayakKing/build/Debug-iphonesimulator/KayakKingTests.octest/fire.png 

我希望這有助於。

+0

正是我需要的,謝謝! – 2010-05-05 19:38:20

+0

這是一個方便的小循環。謝謝! – 2012-08-23 16:00:42

0

我遇到了這個問題與Xcode 4,我的問題是,我有一箇舊的Xcode 3項目,並以某種方式測試目標信息plist失蹤。我爲該項目添加了一個新的UnitTests-Info.plist,並且我突然能夠再次檢索資源。

相關問題