Objective c 如何使用Kiwi异步测试委托

Objective c 如何使用Kiwi异步测试委托,objective-c,unit-testing,ios6,kiwi,Objective C,Unit Testing,Ios6,Kiwi,伙计们, 多年来,我一直在寻找一些关于如何使用Kiwi测试异步测试委托方法的好例子 我有一个定义测试协议的管理器类,在委托中返回一个pass和fail方法。有人能提供关于如何做到这一点的示例代码吗?我可以让测试类本身实现调用管理器上的方法吗 谢谢大家通过创建代理的模拟对象,然后检查模拟对象是否收到预期的代理回调,您可以实现我认为您正在尝试实现的目标。所以这个过程看起来像: 创建符合委托协议的模拟对象: id delegateMock=[KWMock mockForProtocol:@prot

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

我有一个定义测试协议的管理器类,在委托中返回一个pass和fail方法。有人能提供关于如何做到这一点的示例代码吗?我可以让测试类本身实现调用管理器上的方法吗

谢谢大家

通过创建代理的模拟对象,然后检查模拟对象是否收到预期的代理回调,您可以实现我认为您正在尝试实现的目标。所以这个过程看起来像:

  • 创建符合委托协议的模拟对象:
id delegateMock=[KWMock mockForProtocol:@protocol(YourProtocol)]

  • 将模拟设置为manager类的委托:
[manager setDelegate:delegateMock]

  • 创建包含manager类将返回的数据的对象:
NSString*response=@“foo”

  • 设置最终应使用方法和响应对象调用mock的断言(在本例中,我希望收到
    managerRepliedWithResponse
    foo
[[[delegateMock最终应]接收]管理器使用响应:响应]

  • 调用正在测试的方法:
[manager performymmethod]

关键是在调用该方法之前设置期望值,并最终使用
shouldentially
,这会延迟正在检查的断言,并为
管理器
对象提供执行该方法的时间

Kiwi wiki上列出了一系列您也可以使用的期望值-


我已经编写了这个过程,尽管它更具体地适应了我正在处理的情况。

您可以像示例中那样做

 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()];
         });
    });
});

完整的示例可以建立在

+1上,以了解非常微妙但非常重要的细节!“关键是在你调用方法之前设定期望值”现在已经一年多了,我也在为同样的事情挣扎。在使用expectFutureValue/不使用之前/之后,它根本不起作用。我唯一能让这该死的等待请求完成的方法就是在某处检查一个真正的值。