簡體   English   中英

如何從NSInvocation中提取“函數”類型的參數

[英]How to extract an argument of 'function' type from NSInvocation

我正在為接收協議作為輸入參數的函數編寫單元測試。
我正在測試的此函數在內部調用該協議的某些方法。 我想模擬這個協議和那個方法。
為了使用OCMock模擬協議,我編寫了以下代碼: id<MyProtocol> myProtocol = OCMProtocolMock(@protocol(MyProtocol));

現在要模擬該功能,我正在使用OCMStub。 有趣的是該函數不返回任何值,而是將回調作為輸入參數並調用它。 這是它的簽名- (void)myFunction:(void (^ _Nonnull)(NSDictionary<NSString *, NSString *> * _Nonnull))completion;

我正在編寫以下代碼來模擬此功能:
OCMStub([myProtocol myFunction:[OCMArg any]])._andDo(^(NSInvocation *invocation){ void (^ _Nonnull)(NSDictionary<NSString *, NSString *> * _Nonnull) completion; [invocation getArgument:&completion atIndex:0]; // Here I will invoke the completion callback with some dictionary and invoke the invocation });

但是,我收到以下錯誤:“ Expected identifer or '(' ”。錯誤指向定義completion變量的行。

如何定義簽名void (^ _Nonnull)(NSDictionary<NSString *, NSString *> * _Nonnull)的函數變量?

那不是功能。 這是一個街區!

無論如何,函數和塊在聲明中都可以視為void * 之后,您需要將它們轉換為適當的類型。

但這可能是處理它的最簡單方法。 從調用中提取為void* ,並轉換為塊,然后調用它。

實際上,我可以通過執行以下操作來提取第一個參數:
OCMStub([myProtocol myFunction:[OCMArg any]])._andDo(^(NSInvocation *invocation){ void (^ completion)(NSDictionary<NSString *, NSString *> * _Nonnull); [invocation getArgument:&completion atIndex:2]; // Do other stuff });

我只是在錯誤地聲明了“ block”類型的變量。
而且我還意識到應該通過index = 2訪問第一個參數;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM