2009-08-17 50 views
17

我試圖嘲弄具有以下特徵的等效的方法:我希望它返回一個小字典,這樣我的測試可以確保該代碼使用字典正確我如何模擬一個接受一個句柄作爲OCMock中的參數的方法?

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error 

。然而,無論我做什麼,OCMock總是從方法返回零,無論我如何將它存根出來。錯誤開始在我測試的代碼爲零,而這些不同的方法我試過磕碰它:

NSError * error = nil; 
[[[mock stub] andReturn:someDict] uploadValues:YES error:&error]; 

[[[mock stub] andReturn:someDict] uploadValues:YES error:nil]; 

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg any]]; 

和他們沒有工作。 OCMock是否支持處理爲存根消息參數,如果是這樣,那麼執行此操作的正確方法是什麼?

回答

-3

可悲的是,我還沒有找到一個很好的解決辦法。我可以說最好的辦法是儘可能小地使用NSError **,然後將它放在一個單獨的函數中,您可以完全嘲笑你的部分模擬。

我發現任何使用除NSObject *(或派生)或原始值(NSInteger,BOOL等)以外的任何代碼幾乎不可能使用OCMock進行測試。

+0

是啊,這是有道理的。感謝您的洞察力。 – Kevlar 2009-12-10 05:50:39

+3

使用和提供接受NSError的方法**是Cocoa中的首選錯誤處理機制。我建議堅持這種模式,並看看AndreasJärliden的模擬這些方法的答案。 – rluba 2011-08-17 06:40:23

+2

請參閱下面的AndreasJärliden的答案。你的回答不正確。 – markshiz 2013-02-08 18:54:53

43
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]]; 

NSError* someError = ... 
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]]; 

你也可以做

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]]; 

,但是這可能導致你的代碼錯誤地認爲你傳回一個真正的NSError。

+5

在最近版本OCMock的,你可以使用'[OCMArg anyObjectRef]'而不是'[OCMArg anyPointer]'以避免在ARC錯誤,當你正在處理的指針到指針Objective-C的對象類型(如'NSError **')。 – 2014-05-22 16:04:57

3

弧,你的方法聲明可能會是這樣的:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error; 

這裏是我嘲笑這些類型的方法:

BOOL mockDoSomething = YES; 

NSError __autoreleasing *error = nil; 

[[[mock stub] andReturn:someDict] uploadValues:OCMOCK_VALUE(mockDoSomething) error:&error]; 
+1

具體而言,以下似乎在預期中工作得很好: 錯誤:((NSError __autoreleasing **)[OCMArg anyPointer]) – 2012-12-14 19:40:34

3
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer]; 

[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] 
    yourMethodCall:err]; 
+0

這對我來說就像一個魅力。 – 2014-01-03 20:49:33

3

我創建了OCMArg一個類別幫助這種情況。

OCMArg + Helpers.h:

@interface OCMArg (Helpers) 

+ (NSError *__autoreleasing *)anyError; 

@end 

OCMArg + Helpers.m:

@implementation OCMArg (Helpers) 

+ (NSError *__autoreleasing *)anyError { 
    return (NSError *__autoreleasing *)[OCMArg anyPointer]; 
} 

@end 

然後,每當我有一個錯誤PARAM我需要模擬,使用anyError,就像這樣:

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]]; 
+1

此外,它看起來像OCMock上的最新版本的OCMock在OCMarg,'+(id __autoreleasing *)anyObjectRef'中有這些行。 – 2014-01-13 17:13:22

相關問題