Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何模拟AFHTTPClient类和测试方法getPath:参数:成功:失败:?_Ios_Objective C_Mocking_Afnetworking_Ocmock - Fatal编程技术网

Ios 如何模拟AFHTTPClient类和测试方法getPath:参数:成功:失败:?

Ios 如何模拟AFHTTPClient类和测试方法getPath:参数:成功:失败:?,ios,objective-c,mocking,afnetworking,ocmock,Ios,Objective C,Mocking,Afnetworking,Ocmock,我是AFNetworking框架的新手。我已经实现了对服务器的简单GET请求 @implementation MyClass … - (void)signInWithUsername:(NSString *)username andPassword:(NSString *)password withBlock:(SignInBlock)block { [client getPath:@"test.json" parameters:Nil success:^(AFHTTPRequestOpera

我是AFNetworking框架的新手。我已经实现了对服务器的简单GET请求

@implementation MyClass
…

- (void)signInWithUsername:(NSString *)username andPassword:(NSString *)password withBlock:(SignInBlock)block {
[client getPath:@"test.json" parameters:Nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    block(YES, [responseObject objectForKey:@"access_token"]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    block(NO, nil);
}];
}
块声明:

typedef void (^SignInBlock)(BOOL success, NSString *token);
我不知道如何正确地模拟这个
AFHTTPClient
对象,以检查参数(
SignInBlock
)中的block是否被调用以及使用了哪些参数。我怎样才能正确地做到这一点


提前感谢您。

在您的情况下,您根本不需要模拟,只需声明将正确的值发送到您的块:

考虑
Foo

- (void)signInWithUsername:(NSString *)username andPassword:(NSString *)password withBlock:(SignInBlock)block
{
    if ([username isEqualToString:@"Ben"])
    {
        block(YES, @"bentoken");
    }
    else
    {
        block(NO, nil);
    }
}
测试是:

- (void)testSignInWithUsername
{
    SignInBlock testYes = (SignInBlock)^(BOOL *success, NSString *token)
    {
        STAssertTrue(success, @"Expected Ben to be true");
        STAssertEqualObjects(token, @"bentoken", @"Expected the ben token");
    };
    Foo *foo = [Foo new];
    [foo signInWithUsername:@"Ben" andPassword:@"Whatever" withBlock:testYes];
}
我做到了

- (void)testTokenInBlockShouldBeNotNil {

id mockClient = [OCMockObject mockForClass:[AFHTTPClient class]];

[[[mockClient expect] andDo:^(NSInvocation *invocation) {

    void (^successBlock)(AFHTTPRequestOperation *operation, id responseObject) = nil;

    [invocation getArgument:&successBlock atIndex:4];

    successBlock(nil, @{@"access_token" : @"this_is_a_token"});

}] getPath:[OCMArg any] parameters:[OCMArg any] success:[OCMArg any] failure:[OCMArg any]] ;

RKObjectManager *manager = [[RKObjectManager alloc] init];
manager.HTTPClient = mockClient;

TokenBlock block = ^(NSString *token) {
    XCTAssertNotNil(token, @"");
};

CTFAPIConnection *connection = [[CTFAPIConnection alloc] initWithManager:manager];
_accounts = [[CTFAPIAccounts alloc] initWithConnection:connection];
id mockAccounts = [OCMockObject partialMockForObject:_accounts];
[mockAccounts signInWithUsername:[OCMArg any] andPassword:[OCMArg any] withBlock:block];
}

在这里查看我的答案:@e1985我关注的是块检查部分,所以在Tomasz的情况下,这将涉及网络调用,而不是真正的单元测试。我不知道上面的方法是否有一个好的单元测试,因为
client
不是您的代码(您可以假定它将调用适当的方法,因为它已经过单独的单元测试)。谢谢@BenFlynn的帮助。我早就知道怎么做了。阅读我的答案。从调用中抓取块的好用法。