OCMock一个Class方法用自定义数据回调传递的块

use*_*681 2 unit-testing mocking objective-c ocmock

我有一个类来处理我的所有网络通信,如下所示:

typedef void (^ networkEndblock) (NSArray *, NSError *);

@interface NetworkAPI : NetworkBase

+ (void) doSomeNetworkAcion:(networkEndblock) endBlock;

@end
Run Code Online (Sandbox Code Playgroud)

我使用上面这样的代码(我不想在这里讨论不相关的细节)

- (void) runMyProcess:(SomeEndBlock)proccesEnded{

  // Bussiness logic


  // Get Data from the web
  [NetworkAPI doSomeNetworkAcion:^(NSArray *resultArray, NSError *error){

   // Check for error. if we have error then do error handling
   // If no error, check for array.
   // If array is empty then go to code that handles empty array
   // else Process data                                 

   }];
}
Run Code Online (Sandbox Code Playgroud)

在我的测试方法中,我想触发runMyProcess进行测试,我不想让它去网络,我想控制它并设置案例以使其返回错误,空数组等等.我知道如何使用SenTest,它是MACROS,但我不知道如何伪造我的网络API.

我查看存根并期待,但如果我能做我想做的事情,我会感到困惑.

谢谢

Ben*_*ynn 5

类mock [NetworkAPI doSomeNetworkAction:]并使用andDo块.

// This is in the OCMock project but is really useful
#import "NSInvocation+OCMAdditions.h"

// Whatever you want for these values
NSArray *fakeResultArray;
NSError *fakeError;

id networkAPIMock = [OCMockObject mockForClass:NetworkAPI.class];
[[[networkAPIMock expect] andDo:^(NSInvocation *invocation) {
    networkEndBlock endBlock = [invocation getArgumentAtIndexAsObject:2];
    endBlock(fakeResultArray, fakeError);
}] doSomeNetworkAction:OCMOCK_ANY];
Run Code Online (Sandbox Code Playgroud)

另外,我会利用NetworkEndBlock我的typedef,因为它会让你的代码更易于阅读.