2010-01-06 43 views
1

我正在嘗試爲我的iPhone應用程序設置單元測試。我跟着Apple Unit Testing documentation通過和woked罰款,但只要我在給測試增加了一個班,我得到以下錯誤:iPhone單元測試:調用自定義代碼時找不到符號

"_OBJC_CLASS_$_RootViewController", referenced from: 
     [email protected] in AppDelegateTests.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

應用程序本身是用於數據存儲的核心數據提供了基本的導航應用程序。

單元測試如下:

#import <SenTestingKit/SenTestingKit.h> 
#import <UIKit/UIKit.h> 
#import <CoreData/CoreData.h> 

#import "HSStabilityAppAppDelegate.h" 
#import "RootViewController.h" 
@interface AppDelegateTests : SenTestCase { 
HSStabilityAppAppDelegate *appDelegate; 
} 
@end 


@implementation AppDelegateTests 
// all code under test must be linked into the Unit Test bundle 


#pragma mark - 
#pragma mark Set up and tearDown 

#if APPLICATION_TESTS 
- (void) setUp { 
appDelegate = (HSStabilityAppAppDelegate *)[[UIApplication sharedApplication] delegate]; 
STAssertNotNil(appDelegate, @"Cannot find the application delegate."); 
} 

- (void) tearDown { 
[appDelegate release]; 
} 

#else 

#endif 


#pragma mark - 
#pragma mark Tests 

#if APPLICATION_TESTS 

- (void) testRootViewIsOnTop { 
id topViewControllerClass = [[appDelegate.navigationController topViewController] class]; 
id rootViewControllerClass = [RootViewController class]; 
STAssertEquals(topViewControllerClass, rootViewControllerClass, @"Root view controller was not the top class"); 
} 

#endif 

@end 

如果我正確註釋掉ID rootViewControllerClass線,則程序的鏈接。另外,只有在針對設備目標進行構建時纔會發生這種情況,如果在模擬器上構建應用程序(可能因爲應用程序測試不能在模擬器上運行),則不存在任何問題。

任何人都可以幫助解決這個基本和非常令人生氣的問題嗎?

回答

1

我相信我找到了答案。問題在於,儘管編譯器可以看到定義,但是在鏈接它們時卻沒有找到正確的位置,從而引發這些錯誤。因此,如果我們將類名稱解析移到運行時,我們可以繞過這一切。

相反的:NSManagedObject 使用:NSClassFromString("@NSManagedObject")

這同樣適用於幾乎中定義的所有類。

如果有人能告訴我如何讓它在編譯時工作,我仍然非常感激。

+0

您需要確保您添加的類的源代碼包含在您的測試目標中。在目標> {your_test_target}>編譯源代碼下,您應該看到您的類的實現。例如。如果您有「#import MyClass.h」,請確保您的測試目標的「編譯源代碼」下有「MyClass.m」。 – 2010-03-16 14:53:10

4

我也跟着Apple's iPhone Unit Testing Applications文件,並看到一個鏈接錯誤類似於在試圖單元測試我的一個類時在問題中描述的錯誤。

看起來像你的單元測試類中引用的任何類,所以從你的測試目標運行也需要被添加到該測試目標。爲此,您可以右鍵單擊您的RootViewController類,然後單擊「獲取信息」(Cmd-i快捷鍵)。在目標窗格上,確保您的單元測試目標(例如,'LogicTests',如果您已經按照該文檔中的命名)被選中。

現在該類將與您的測試一起編譯,並且應該可用於您的單元測試。要進行雙重檢查,請展開左側的「Groups & Files」瀏覽器中的'Targets/LogicTests/Compile Resources'節點。這列出了構建目標時可用的所有類文件,現在應該將您的單元測試類與待測試的類一起包含在內。 (請注意,當您創建新應用程序或測試類時,您需要類似地選擇所有適當的目標 - 在命名文件時,在「新文件...」窗口的同一頁上)。

(我正在使用XCode 3.2.3 & OS 4.0,順便說一句)。

相關問題