【问题标题】:OCMock a Class method to call back the passed block with custom DataOCMock 类方法以使用自定义数据回调传递的块
【发布时间】:2013-12-19 21:51:50
【问题描述】:

我确实有一个类可以像这样处理我的所有网络通信:

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

@interface NetworkAPI : NetworkBase

+ (void) doSomeNetworkAcion:(networkEndblock) endBlock;

@end

我使用上面的代码是这样的(我不想在这里进入无关的细节)

- (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                                 

   }];
}

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

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

谢谢

【问题讨论】:

    标签: objective-c unit-testing mocking ocmock


    【解决方案1】:

    类模拟 [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];
    

    另外,我会在我的 typedef 中将 NetworkEndBlock 大写,因为这样可以让其他人更容易阅读您的代码。

    【讨论】:

    • 在 iOS 7 上运行良好,我不得不添加 NSInvocation+OCMAdditions.h,但在 iOS 6.1 中崩溃了,知道吗?
    • 很难说。您的 endBlock 中是否有不符合 iOS6 的内容?崩溃日志说明了什么?
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多