2011-04-22 58 views
21

所以,我有MyViewController的實例在一個UISplitViewController的詳圖。我正在運行單元測試以查看詳細視圖是否包含正確類型的視圖。isKindOfClass:返回單元測試包假陰性

我測試控制器的類型在單元測試使用以下:

[controller isKindOfClass:[MyViewController class]]; 

然而,isKindOfClass方法總是返回NO

當我PO在調試器我得到以下的對象:

(gdb) po controller 
<MyViewController: 0xb31c4d0> 

我也曾嘗試isMemberOfClass:方法,得到了相同的結果。任何人都可以解釋爲什麼會發生?

編輯:所以在閱讀Nick Weaver發佈的文章後,我意識到我在測試包的編譯源代碼階段包含了我的應用程序的源代碼文件。這也是在日誌中通過類似的聲明指出以下幾點:

Class MyViewController is implemented in both /Users/jdoe/Library/Application Support/iPhone Simulator/4.3.2/Applications/670A077A-BAD8-4FA6-945A-851F33114CF5/MyApp.app/MyApp and /Users/jdoe/Library/Developer/Xcode/DerivedData/MyApp-drxyfejeattjwgantzesgensnlnx/Build/Products/Debug-iphonesimulator/MyAppTests.octest/MyAppTests. One of the two will be used. Which one is undefined. 

然而,當我從測試包的編譯來源刪除源文件建立階段,我會得到看起來像下面的鏈接錯誤:

Undefined symbols for architecture i386: 
"_OBJC_CLASS_$_MyViewController", referenced from: 
    objc-class-ref in _MyViewControllerTests.o 
(maybe you meant: _OBJC_CLASS_$__MyViewControllerTests) 
+0

是否在運行時沒有測試這種行爲相同? – 2011-04-22 12:23:58

+0

從我可以看到它不 – nduplessis 2011-04-22 12:26:38

回答

12

正如我所提到的問題,我才意識到自己被錯誤地包括在測試包的編譯源的應用程序的源文件建立階段。從這個構建階段中刪除源文件後,我通過改變設置爲「無」爲調試配置

Xcode build settings

由默認的構建隱藏的符號解決了缺少的符號鏈接錯誤這解決了連接錯誤和意味着我不再重複,包括源文件


注:另外,一定要設置「主機目標」爲測試目標在Xcode的Info選項卡,以便它會從那裏拉編譯源代碼

0

有同樣的問題與我的應用程序之一,從測試目標中移除.m文件固定它。在你的情況下,從測試目標中移除MyViewController.m將解決你的問題。 打開你的.m文件。轉到Xcode的右側導航器,並從測試目標的Target成員中刪除打勾。 問題是編譯器編譯2個MyViewController.m(一個用於應用一個用於測試)和的.class可能返回不同的對象。