繁体   English   中英

具有两个块完成的OCMock存根方法

[英]OCMock stub method with two block completion

我正在尝试模拟一个类( AFHTTPSessionManager ),该类具有一个包含2个块的方法,我如何手动触发它们,例如,进行两个测试,一个将使用第一个块实现,另一个测试将使用第二个块实现。

[manager GET:path parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
    //First block to trigger.
    //logic code here
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    //Second block to trigger.
    //logic code here
}];

当前,它将始终触发第二个块。

我嘲笑这样的课程:

NSError *error = [NSError errorWithDomain:NSLocalizedFailureReasonErrorKey code:-1009 userInfo:nil];
NSDictionary *responseObject = [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key", nil];

id mockAFHTTPSessionManager = OCMClassMock([AFHTTPSessionManager class]);

OCMStub([mockAFHTTPSessionManager alloc]).andReturn(mockAFHTTPSessionManager);
OCMStub([mockAFHTTPSessionManager initWithBaseURL:OCMOCK_ANY]).andReturn(mockAFHTTPSessionManager);
OCMStub([mockAFHTTPSessionManager GET:OCMOCK_ANY parameters:OCMOCK_ANY success:([OCMArg invokeBlockWithArgs:OCMOCK_ANY, responseObject, nil]) failure:([OCMArg invokeBlockWithArgs:OCMOCK_ANY, error, nil])]);

我不知道是否有特定原因要使用alloc / initWithBaseURL,但这是模拟AFHTTPSessionManager的方式:

id mockSessionManager = OCMClassMock([AFHTTPSessionManager class]);
OCMStub([mockSessionManager manager]).andReturn(mockSessionManager);

现在,为了测试成功/失败块调用,我将提出一个建议,使我省去很多麻烦:不要内联您的块。 而是从单独的方法返回这些块,然后分别测试这些方法。 然后,在测试实际GET:parameters:success:failure调用的测试中,您只需要期望会返回返回完成块的方法即可。

这是一个例子:

MyClass.m

- (void)doGetRequest
{
    AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
    [manager GET:@"http://something.whatever.com"
             parameters:nil 
                success:[self getSuccessBlock] 
                failure:[self getFailureBlock]];
}

- (void (^)(NSURLSessionDataTask*, id))getSuccessBlock
{
    return ^(NSURLSessionDataTask* task, id responseObject)
        {
            // handle success
        };
}

- (void (^)(NSURLSessionDataTask*, NSError*))getFailure
{
    return ^(NSURLSessionDataTask* task, NSError* error)
        {
            // handle failure
        }
}

MyClassTests.m

- (void)testDoGetRequest
{
    MyClass* myClass = [[MyClass alloc] init];
    id mockMyClass = OCMPartialMock(myClass);
    id mockSessionManager = OCMClassMock([AFHTTPSessionManager class]);
    OCMStub([mockSessionManager manager]).andReturn(mockSessionManager);

    id successBlock = ^(NSURLSessionDataTask* task, id o){};
    id failureBlock = ^(NSURLSessionDataTask* task, NSError* error){};
    OCMExpect([mockMyClass getSuccess]).andReturn(successBlock);
    OCMExpect([mockMyClass getFailure]).andReturn(failureBlock);

    OCMExpect([mockSessionManager GET:OCMOCK_ANY
                           parameters:OCMOCK_ANY 
                              success:successBlock
                              failure:failureBlock]);

    [myClass doGetRequest];

    OCMVerifyAll(mockMyClass);
    OCMVerifyAll(mockSessionManager);
}

- (void)testGetSuccessBlock
{
    MyClass* myClass = [[MyClass alloc] init];
    // setup expectations
    NSURLSessionDataTaks* fakeTask = // whatever you need here
    id fakeResponseObject = // whatever you need here
    [myClass getSuccessBlock](fakeTask, fakeResponseObject);
    // evaluate expectations
}

- (void)testGetFailureBlock
{
    MyClass* myClass = [[MyClass alloc] init];
    // setup expectations
    NSURLSessionDataTaks* fakeTask = // whatever you need here
    NSError* fakeError = // whatever you need here
    [myClass getFailureBlock](fakeTask, fakeError);
    // evaluate expectations
}

(我基本上是这样写的,所以某些语法可能不是100%,但是您应该明白这一点)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM