2012-11-28 22 views
6

H guys, Tôi đã cố gắng cho các lứa tuổi để tìm một số ví dụ tốt về cách sử dụng thử nghiệm Kiwi để kiểm tra phương pháp đại biểu, không đồng bộ.Làm thế nào để kiểm tra các đại biểu không đồng bộ với Kiwi

Tôi có một lớp người quản lý xác định các giao thức để thử nghiệm, với phương thức vượt qua và thất bại được trả về trong đại biểu. Bất cứ ai có thể cung cấp mã mẫu về cách làm điều này? Tôi có thể tự thực hiện lớp thử nghiệm để gọi các phương thức trên trình quản lý không?

Thanks guys

Trả lời

4

Bạn có thể làm những gì tôi nghĩ bạn đang cố gắng để đạt được bằng cách tạo ra một đối tượng giả mà đứng ở cho các đại biểu, và sau đó kiểm tra xem các đối tượng giả nhận được callbacks đại biểu mà bạn mong đợi . Vì vậy, quá trình này sẽ như thế nào:

  • tạo một đối tượng giả mà phù hợp với các giao thức đại biểu:

id delegateMock = [KWMock mockForProtocol:@protocol(YourProtocol)];

  • thiết lập các mô hình như các đại biểu của lớp quản lý của bạn:

[manager setDelegate:delegateMock];

  • tạo một đối tượng chứa dữ liệu đó sẽ được trả lại bởi lớp quản lý của bạn:

NSString *response = @"foo";

  • thiết lập sự khẳng định rằng giả nên cuối cùng được gọi với các phương pháp và phản ứng đối tượng (trong trường hợp này, tôi đang mong nhận được managerRepliedWithResponsefoo)

[[[delegateMock shouldEventually] receive] managerRepliedWithResponse:response];

  • gọi phương pháp thử:

[manager performMyMethod];

Điều quan trọng là thiết lập sự mong đợi trước bạn gọi phương thức, và sử dụng shouldEventually mà trì hoãn sự khẳng định được kiểm tra và đưa ra thời gian đối tượng manager để thực hiện phương thức.

Có một loạt các mong đợi của bạn cũng có thể sử dụng được liệt kê trên wiki Kiwi - https://github.com/allending/Kiwi/wiki/Expectations

Tôi đã viết quá trình lên in more detail in a post on my site, dù rằng nó cụ thể hơn hướng lên với tình hình tôi đang đối phó với .

+2

1 cho các chi tiết rất tinh tế nhưng rất quan trọng! "Điều quan trọng là đặt kỳ vọng trước khi bạn gọi phương thức" – Bach

+0

Nó đã được nhiều hơn một năm nay và tôi đang đấu tranh với cùng một điều. Nó chỉ đơn giản là không làm việc, trước/sau với expectFutureValue/mà không có. Cách duy nhất tôi có thể có sự chờ đợi này cho yêu cầu được thực hiện là bằng cách có một giá trị thực sự để kiểm tra ở đâu đó. – Hugo

6

Bạn có thể làm như trong ví dụ

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

Full ví dụ có thể được xây dựng trên this link.

Các vấn đề liên quan