gpt4 book ai didi

objective-c - 如何在 Kiwi 中 stub 方法 block ?

转载 作者:太空狗 更新时间:2023-10-30 03:36:40 27 4
gpt4 key购买 nike

我想使用 Kiwi stub 一个将 block 作为参数的方法。这是带有代码的完整解释:

我有一个名为 TestedClass 的类,它有一个方法 testedMethod 依赖于 NetworkClass 类,它通过 AFNetworking 调用服务器,并返回它通过 block 的响应。翻译成代码:

@interface TestedClass : NSObject
-(void)testMethod;
@end

-(void)testMethod
{
NetworkClass *networkClass = [[NetworkClass alloc] init];

[networkClass networkMethod:^(id result)
{
// code that I want to test according to the block given which I want to stub
...
}];
}



typedef void (^NetworkClassCallback)(id result);

@interface NetworkClass : NSObject
-(void)networkMethod:(NetworkClassCallback)handler;
@end

-(void) networkMethod:(NetworkClassCallback)handler
{
NSDictionary *params = @{@"param":@", @"value"};
NSString *requestURL = [NSString stringWithFormat:@"www.someserver.com"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURLURLWithString:requestURL]];
NSURLRequest *request = [httpClient requestWithMethod:@"GET" path:requestURL parameters:params];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
handler(responseObject);
}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
handler(nil);
}];

[operation start];
}

如何使用 Kiwi 对 networkMethod 进行 stub 以对 testMethod 进行单元测试?

更新:找到了如何在 Kiwi 中执行此操作,请参阅下面的回答。

最佳答案

以下是在 Kiwi 中执行此操作的方法:

首先,你必须依赖注入(inject) NetworkClassTestedClass (如果不清楚如何,请添加评论,我会解释;这可以作为一个属性来完成为简单起见。这样您就可以对 NetworkClass) 的模拟对象进行操作

然后是您的规范,为网络类创建模拟并创建您要进行单元测试的类:

SPEC_BEGIN(TestSpec)

describe(@"describe goes here", ^{
it(@"should test block", ^{
NetworkClass *mockNetworkClass = [NetworkClass mock];
KWCaptureSpy *spy = [mockNetworkClass captureArgument:@selector(networkMethod:) atIndex:0];
TestedClass testClass = [TestedClass alloc] init];
testClass.networkClass = mockNetworkClass;
[testClass testMethod];

NetworkClassCallback blockToRun = spy.argument;
blockToRun(nil);

// add expectations here

});
});

SPEC_END

解释这里发生了什么:

您正在创建 TestedClass 并调用 testMethod。然而,在此之前,我们正在创建一个名为 Spy 的东西 - 它的工作是在调​​用 networkMethod: 时捕获第一个参数中的 block 。现在,是时候实际执行 block 本身了。

这里很容易混淆所以我强调一点:调用的顺序很重要;你首先声明 spy ,然后调用被测试的方法,然后你才真正调用和执行 block !

这将使您能够检查您想要的内容,因为您是执行该 block 的人。

希望它对其他人有帮助,因为我花了很长时间才理解这个流程。

关于objective-c - 如何在 Kiwi 中 stub 方法 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19398918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com