2013-06-19 32 views
2

我試圖將單元測試添加到現有的iOS應用程序,其中使用OCMockOCMock:存根@dynamic屬性

在這個應用程序中,我們有一堆CoreData實體和生成的類。這些類顯然包含@dynamic屬性。

我試圖存根這些屬性之一如下:

self.event = [OCMockObject mockForClass:[ACEvent class]]; 
[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] eventGUID]; 

的一點是,這是行不通的。顯然,因爲@dynamic屬性默認沒有實現,所以在這種情況下依賴於CoreData來提供它。我結束了一個NSError:

-[NSProxy doesNotRecognizeSelector:eventGUID] called! 

我已經看到了這個地方已經解決了通過抽象CoreData實體的協議(OCMock with Core Data dynamic properties problem)背後的其他問題。但是由於這是一個現有的代碼庫,我沒有這個選項,因爲我不能重構所有的東西。

任何人都可以提供另一種解決方案嗎?

編輯: 作爲一個方面說明,我剛剛找到了解決方案,但我擔心它不能在所有情況下工作。 我所做的是爲測試目標中的這些方法提供一個樣本空實現。它的工作原理,但我擔心它可能會打破依賴CoreData工作的其他測試。對此有何看法?

+0

在一個類別使用空方法應該工作。 OCMock需要實現的原因是必須弄清楚方法簽名是什麼。一旦知道存根應該工作。 也許我們可以添加一些東西,讓OCMock假定一個沒有參數的方法和一個id返回類型,如果它在模擬類中找不到方法的話。雖然這看起來有點脆弱。 –

回答

3

對於OCMock,我總是爲每個管理對象創建一個協議,然後爲這些協議創建模擬,但正如你所說你不能這麼做,所以我建議創建一個具有與你在你想測試的代碼(對於每個NSManagedObject),然後在傳遞這些假對象時(使用OCMock並對所需的方法進行存根或僅創建假類的對象並設置所需屬性),就可以使用強制轉換。

+0

假物體像一個魅力工作,謝謝:) – aspyct

2

上面的回答並不滿足我,因爲我不喜歡爲此創建協議。所以我發現有一個更簡單的方法來做到這一點。取而代之的

[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] eventGUID]; 

只要寫

[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] valueForKey:@"eventGUID"]; 
+0

剛剛嘗試過使用最新版本的OCMock。它沒有工作。看起來核心數據不使用valueForKey :. :-( – drekka