2013-11-25 82 views
1

我想依賴於參數的值動態地返回到模擬的方法,在概念上是這樣的:存根方法,並動態地設置其返回值的輸入參數

[realObject stub] myMethod:CAPTUREDARGUMENT) andReturn:myMethod:CAPTUREDARGUMENT]; 

或者在訪問調用塊像OCMock:

void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) { 
    /* code that reads and modifies the invocation object */ 
}; 
[[[mock stub] andDo:theBlock] someMethod:[OCMArg any]]; 

這可能與獼猴桃?

回答

5

有可能使用stub:withBlock:

[realObject stub:@selector(myMethod:) withBlock:^id(NSArray *params) { 
    return [params objectAtIndex:0]; 
]; 
+0

'存根:withBlock:'非常酷,功能強大。你應該將自己的答案標記爲已接受的答案;) – mokagio

+1

@mokagio:如果它太酷了,你應該給我一個upvote :-) – fabb

-1

拍攝參數的推薦的方法是使用捕獲的間諜,例如:

id testDouble = [SomeClass mock]; 
object.property = testDouble; 

KWCaptureSpy *spy = [testDouble captureArgument:@selector(methodWithParam:) atIndex:0]; 

[object doSomethingWithProperty]; 

[[spy.argument should] equal:someResult]; 

它也可以使用stub:withBlock:實現,但拍攝間諜趨向當涉及到檢查方法參數的任務時,讓你的意圖更清晰。這使得更具可讀性的規格。

+0

我不想捕獲一個參數。我想存根真實對象的方法,但不會返回一個常量值,而是依賴於傳入的參數。 – fabb

+0

@fabb你能否更新這個問題來使這個更清晰?它讀取的方式,特別是標題,這聽起來像你只需要捕捉一個參數,而不是改變它或返回一個不同的值。 –

+0

這是更好嗎?我認爲代碼示例已經很清楚,不是嗎? – fabb