我们, 多年来我一直试图找到一些关于如何使用Kiwi测试来异步测试委托方法的好例子。
我有一个管理器类,它定义了测试协议,并在委托中返回了pass和fail方法。任何人都可以提供如何执行此操作的示例代码吗?我可以让测试类本身实现调用管理器上的方法吗?
谢谢你们
答案 0 :(得分:6)
您可以在示例中执行
SPEC_BEGIN(IFStackOverflowRequestSpec)
describe(@"IFStackOverflowRequestSpec", ^
{
context(@"question request", ^
{
__block IFViewController *controller = nil;
beforeEach(^
{
controller = [IFViewController mock];
});
it(@"should conform StackOverflowRequestDelegate protocol", ^
{
[[controller should] conformToProtocol:@protocol(StackOverflowRequestDelegate)];
});
it(@"should recieve receivedJSON", ^
{
NSString *questionsUrlString = @"http://api.stackoverflow.com/1.1/search?tagged=iphone&pagesize=20";
IFStackOverflowRequest *request = [[IFStackOverflowRequest alloc] initWithDelegate:controller urlString:questionsUrlString];
[[request fetchQestions] start];
[[[controller shouldEventuallyBeforeTimingOutAfter(3)] receive] receivedJSON:any()];
});
it(@"should recieve fetchFailedWithError", ^
{
NSString *fakeUrl = @"asda";
IFStackOverflowRequest *request = [[IFStackOverflowRequest alloc] initWithDelegate:controller urlString:fakeUrl];
[[request fetchQestions] start];
[[[controller shouldEventuallyBeforeTimingOutAfter(1)] receive] fetchFailedWithError:any()];
});
});
});
可以在this link.
上建立完整示例答案 1 :(得分:4)
您可以通过创建代表委托的模拟对象,然后检查模拟对象是否接收到您期望的委托回调来执行我认为您尝试实现的目标。所以这个过程看起来像:
id delegateMock = [KWMock mockForProtocol:@protocol(YourProtocol)];
[manager setDelegate:delegateMock];
NSString *response = @"foo";
managerRepliedWithResponse
和foo
) [[[delegateMock shouldEventually] receive] managerRepliedWithResponse:response];
[manager performMyMethod];
关键是在调用方法之前设置期望,并使用shouldEventually
延迟正在检查的断言,并为manager
对象提供执行方法的时间。
新西兰维基上列出了一系列您也可以使用的期望 - https://github.com/allending/Kiwi/wiki/Expectations
我已将这个过程写成in more detail in a post on my site,尽管它更具体地说明了我正在处理的情况。