我尝试存根此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]
方法也使用PromiseKit。可以是一个问题吗?我尝试使用this,但它不起作用,并使用旧的OCMock语法。
最佳答案
因此,您已将setCompletionBlockWithSuccess:failure:
方法与实际调用故障处理程序的块进行了连接。就OCMock而言,这意味着直到其他人呼叫setCompletionBlockWithSuccess:failure
之前,什么也不会发生。
现在该方法是一个实例方法,必须在模拟程序上调用。唯一被调用的方法是getWeekEvents
。我不确定如何调用该set方法,因为它需要对模拟的引用。
老实说,我认为您必须重新设计测试。
关于ios - OCMock stub 块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30655380/