如何与Kiwi异步测试代理

时间:2012-11-28 23:26:26

标签: objective-c unit-testing ios6 kiwi

我们, 多年来我一直试图找到一些关于如何使用Kiwi测试来异步测试委托方法的好例子。

我有一个管理器类,它定义了测试协议,并在委托中返回了pass和fail方法。任何人都可以提供如何执行此操作的示例代码吗?我可以让测试类本身实现调用管理器上的方法吗?

谢谢你们

2 个答案:

答案 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";

  • 使用方法和响应对象设置模拟应最终的断言(在这种情况下,我希望接收managerRepliedWithResponsefoo

[[[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,尽管它更具体地说明了我正在处理的情况。