2013-11-09 32 views
2

我試圖在我的UnitTest之外創建我的RKEntityMapping。我擁有的問題是隻有在我的測試中創建它時纔有效。例如,這可以工作:UnitTests的RestKit實體映射不起作用

RKEntityMapping *accountListMapping = [RKEntityMapping mappingForEntityForName:@"CustomerListResponse"               inManagedObjectStore:_sut.managedObjectStore]; 
[accountListMapping addAttributeMappingsFromDictionary:@{@"count": @"pageCount", 
                 @"page": @"currentPage", 
                 @"pages": @"pages"}]; 

雖然下面現在可以工作。 all to accoutListMapping返回上面使用相同的託管對象庫所示的內容: RKEntityMapping * accountListMapping = [_sut accountListMapping];

_sut創建RKEntityMapping我得到這個錯誤:

<unknown>:0: error: -[SBAccountTests testAccountListFetch] : 0x9e9cd10: failed with error: 
Error Domain=org.restkit.RestKit.ErrorDomain Code=1007 "Cannot perform a mapping operation 
with a nil destination object." UserInfo=0x8c64490 {NSLocalizedDescription=Cannot perform 
a mapping operation with a nil destination object.} 

我假設它是指nil目標對象是destinationObject:nil

RKMappingTest *maptest = [RKMappingTest testForMapping:accountListMapping 
              sourceObject:_parsedJSON 
            destinationObject:nil]; 
+0

是的,所以提供一個目標對象。 – Wain

+0

如果我創建符合我的測試的映射,它將在我提供目標對象時起作用; RestKit文檔不提供。如果我在不同的類中創建映射並將其作爲返回值傳遞,那麼即使傳入目標對象也不起作用;它找不到任何可映射的值。我認爲這是RK中的一個錯誤。 –

+0

您是否嘗試過調試2個案例?在RestKit谷歌組或github wiki上詢問可能會更好。 – Wain

回答

0

我用一個類別映射對象上例如

RestKitMappings+SomeClass 

+ (RKObjectMapping*)responsemappings { 
return mappings; 
} 

現在這一類必須被包括在測試目標,以及以其他方式映射將不被傳遞。

+0

謝謝。這工作。 –

0

當你運行一個測試你是不是使用整個映射的基礎設施,所以RestKit不會創建目標對象爲您服務。它只會測試映射本身。所以你需要提供全部三種信息給測試方法,否則它就無法工作。

+0

我不知道爲什麼這對我來說很重要。如果我在單元測試類中創建映射,但映射不起作用,但如果我在單元測試類之外創建完全相同的映射並將其作爲返回值傳遞,則映射不起作用。爲了進行單元測試,我不想將所有映射覆制並粘貼到單元測試中;代碼重複太多。此外,該技術適用於對象映射,但不適用於實體映射。 –

1

當使用Cocoapods時,單獨爲多個目標分別包含RestKit組件時,此問題也可能由重複的類定義引起。

欲瞭解更多信息,請看this answer

3

確保您創建的文件具有您的主要目標和測試目標的目標成員資格。你可以找到這樣的:在你的類的.m文件

  • 點擊
  • 目標籍部分打開Utilities工具欄(一個在右邊)
  • 打勾兩個目標。

這是因爲如果您的類沒有目標成員資格到您的測試目標,測試目標實際上會創建您創建的類的副本,這意味着它具有與主目標不同的二進制文件。這導致該類使用測試版的RestKit二進制文件,而不是主要的項目RestKit。這會導致isKindOfClass方法在嘗試查看您傳遞的映射是否是來自主項目的RKObjectMapping類型時失敗,因爲它是RestKit的測試項目版本中的RKObjectMapping類型,因此您的映射無法使用,你會崩潰。

至少這是我對LLVM編譯器如何工作的理解。我是iOS開發新手,所以如果出現問題,請隨時糾正。

+0

這完全是*發生在我身上的事情。我可以證實這個修復工程。在將所有.m文件添加到目標後,我還必須在構建設置中手動添加我的前綴頭文件。那麼一切都很好。很棒的發現! – isoiphone