【问题标题】:OCMock stub blocksOCMock 存根块
【发布时间】:2015-06-04 22:36:11
【问题描述】:

我尝试存根这个 AFNetworking 方法并测试错误案例:

- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                          failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

我的测试方法如下:

it(@"should return error when remote api fails", ^{
    id mock = OCMClassMock([AFHTTPRequestOperation class]);
    OCMStub([mock setCompletionBlockWithSuccess:[OCMArg any] failure:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
      void (^failureBlock)(AFHTTPRequestOperation *operation, NSError *error) = nil;
      [invocation getArgument:&failureBlock atIndex:3];
      NSDictionary *details = @{ NSLocalizedDescriptionKey : [OCMArg any] };
      NSError *err = [NSError errorWithDomain:@"Some Domain" code:401 userInfo:details];
      failureBlock(nil, err);         
    });
    [API getWeeklyEvents].catch(^(NSError *err) {
      error = [err copy];
    });
    expect(error).will.beTruthy();
});

[API getWeeklyEvents]method 也使用 PromiseKit。会不会是个问题?

我尝试使用this,但它不起作用并使用旧的 OCMock 语法。

【问题讨论】:

    标签: ios objective-c unit-testing ocmock promisekit


    【解决方案1】:

    所以,您已经使用一个实际调用故障处理程序的块来存根setCompletionBlockWithSuccess:failure: 方法。这意味着,就 OCMock 而言,除非有人致电 setCompletionBlockWithSuccess:failure,否则不会发生任何事情。

    现在该方法是一个实例方法,必须在模拟上调用。唯一被调用的方法是getWeekEvents。我不确定如何调用该 set 方法,因为它需要对 mock 的引用。

    说实话,我认为你必须重新设计你的测试。

    【讨论】:

    • 谢谢埃里克。很有建设性的回答。您认为创建存根的畸形 api 响应是个好主意吗?在这种情况下,AFNetworking 应该调用failure 块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多