gpt4 book ai didi

objective-c - OCMock 一个类方法用自定义数据回调传递的 block

转载 作者:行者123 更新时间:2023-12-02 01:07:42 25 4
gpt4 key购买 nike

我确实有一个类可以像这样处理我所有的网络通信:

typedef void (^ networkEndblock) (NSArray *, NSError *);

@interface NetworkAPI : NetworkBase

+ (void) doSomeNetworkAcion:(networkEndblock) endBlock;

@end

我是这样使用上面的代码的(我不想在这里讨论不相关的细节)

- (void) runMyProcess:(SomeEndBlock)proccesEnded{

// Bussiness logic


// Get Data from the web
[NetworkAPI doSomeNetworkAcion:^(NSArray *resultArray, NSError *error){

// Check for error. if we have error then do error handling
// If no error, check for array.
// If array is empty then go to code that handles empty array
// else Process data

}];
}

在我的测试方法中,我想触发 runMyProcess 进行测试,我不希望它去访问网络,我想控制它并设置案例以使其返回错误、空数组等。我知道如何使用 SenTest,它是 MACROS,但我不知道如何伪造我的网络 API。

我查看了 stub 并期待,但如果我能做我想做的事,我感到很困惑。

谢谢

最佳答案

类模拟 [NetworkAPI doSomeNetworkAction:] 并使用 andDo block 。

// This is in the OCMock project but is really useful
#import "NSInvocation+OCMAdditions.h"

// Whatever you want for these values
NSArray *fakeResultArray;
NSError *fakeError;

id networkAPIMock = [OCMockObject mockForClass:NetworkAPI.class];
[[[networkAPIMock expect] andDo:^(NSInvocation *invocation) {
networkEndBlock endBlock = [invocation getArgumentAtIndexAsObject:2];
endBlock(fakeResultArray, fakeError);
}] doSomeNetworkAction:OCMOCK_ANY];

另外,我会在我的 typedef 中将 NetworkEndBlock 大写,因为它会让您的代码更容易被其他人阅读。

关于objective-c - OCMock 一个类方法用自定义数据回调传递的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692393/

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