2015-06-04 52 views
0

你好,我試圖改變我已存在的函數的參數。 我在日誌中看到我的存根調用成功,我想更改其中一個參數並運行原始函數。我可以用OCMock做到嗎?有沒有辦法改變OCMock中的一個參數,並繼續運行存根函數

下面是我在做什麼:

.... 

id testMgrMock = [OCMockObject partialMockForObject:testClassInstance]; 

OCMStub([testMgrMock addRequestWithMethod:OCMOCK_ANY 
            path:OCMOCK_ANY 
           parameters:OCMOCK_ANY 
            headers:OCMOCK_ANY 
            body:OCMOCK_ANY 
           delegate:OCMOCK_ANY 
          successBlock:OCMOCK_ANY 
          failureBlock:OCMOCK_ANY]). 
andDo(^(NSInvocation* invocation){ 
    NSString* path = @"http://addressnotexi.st"; 
    [invocation setArgument:&path atIndex:2]; 

    // here I want to call "addRequestWithMethod:path:parameters:header (etc)" 
    // on a real object with the parameter "path" changed to my string 

    [invocation invoke]; 
}); 
...... 

[invocation invoke];給我bad_exec崩潰。即使我不改變參數。

如何正確地做到這一點?它有可能嗎?

謝謝

+0

您是否曾嘗試在調用invoke之前告訴調用以保留其參數? –

+0

是的,它沒有工作 –

回答

0

我發現這個問題

需要在以下方式reaarange代碼:

@implementation

NSString invalidPath = @"http://theaddressthatdoesnotexis.ts"; 

,代碼如下所示:

.... 

id testMgrMock = [OCMockObject partialMockForObject:testClassInstance]; 

OCMStub([testMgrMock addRequestWithMethod:OCMOCK_ANY 
            path:[OCMArg isNotEqual:invalidPath] 
           parameters:OCMOCK_ANY 
            headers:OCMOCK_ANY 
            body:OCMOCK_ANY 
           delegate:OCMOCK_ANY 
          successBlock:OCMOCK_ANY 
          failureBlock:OCMOCK_ANY]). 
andDo(^(NSInvocation* invocation){ 
    [invocation setArgument:&invalidPath atIndex:3]; 
    [invocation invoke]; 
}); 
...... 

簡而言之。我的調用正在工作,但如果自稱

+0

當然!我也完全錯過了這一點。你基本上創建了一個無限遞歸。很高興你找到了它。 –

+0

只是想補充一點,我遇到了同樣的問題,上面的示例代碼仍然存在問題。如果你打電話 –

+1

只是想補充一點,我遇到了同樣的問題,上面的代碼仍然會有無限遞歸,因爲你調用[invocation invoke]。相反,我相信你想要做的是替換參數,然後調用andForwardToRealObject,它將繞過部分模擬並調用真實函數,但使用你的模擬參數。 –

相關問題