2011-09-05 22 views
5

Tôi đang thử nghiệm các cuộc gọi dịch vụ web thực với OCMock.OCMock bị trì hoãn xác minh/Xử lý thời gian chờ trong các bài kiểm tra đơn vị

Ngay bây giờ tôi đang làm một cái gì đó như:

- (void)testWebservice 
{ 
    id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)]; 
    [[mydelegatemock expect] someMethod:[OCMArg any]]; 

    [SUT sutWithDelegate:mydelegatemock]; 

    // we need to wait for real result 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; 

    [(OCMockObject*)mydelegatemock verify]; 
} 

Nó hoạt động tốt, nhưng nó hàm ý rằng tất cả các xét nghiệm như vậy sẽ mất 2 giây.

Có cách nào tôi có thể đặt thời gian chờ không, ví dụ: 2 giây và để gọi đến số someMethod của mydelegatemock ngay lập tức verify và hoàn thành trường hợp kiểm tra?

Trả lời

5

Tôi làm điều này bằng cách sử dụng chức năng tiện dụng tiện ích tôi thấy at this link:

#import <Foundation/Foundation.h> 
#import <OCMock/OCMock.h> 

@interface TestUtils : NSObject 
+ (void)waitForVerifiedMock:(OCMockObject *)mock delay:(NSTimeInterval)delay; 
@end 

Và việc thực hiện:

#import "TestUtils.h" 
@implementation TestUtils 

+ (void)waitForVerifiedMock:(OCMockObject *)inMock delay:(NSTimeInterval)inDelay 
{ 
    NSTimeInterval i = 0; 
    while (i < inDelay) 
    { 
     @try 
     { 
      [inMock verify]; 
      return; 
     } 
     @catch (NSException *e) {} 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     i+=0.5; 
    } 
    [inMock verify]; 
} 

@end 

này cho phép tôi phải chờ đến một sự chậm trễ tối đa (tính bằng giây) mà không chờ đợi toàn bộ số tiền mỗi lần.

+2

Có lẽ có nguồn gốc ở đây? ... http://touchalicious.com/blog/2009/11/5/asynchronous-unit-testing-with-ocmock.html –

+1

Cảm ơn Max - trông giống như nguồn. Tôi đã cập nhật phản hồi ban đầu với liên kết đến bản gốc. –

1

Tôi sẽ tách kiểm tra chức năng của các dịch vụ web của bạn (nếu bạn cần làm điều đó) từ thử nghiệm đơn vị thuộc lớp của bạn xử lý kết quả dịch vụ web.

Để kiểm tra đơn vị, bạn nên thực hiện cuộc gọi dịch vụ web, cung cấp kết quả mô phỏng. Sau đó, kiểm tra của bạn sẽ xác minh rằng, đối với kết quả được xác định rõ đó, lớp của bạn sẽ hoạt động tương ứng.

Nếu bạn cũng muốn thử nghiệm chức năng dịch vụ web của mình (nói rằng nó trả về một câu trả lời cụ thể cho một số yêu cầu), bạn không cần phải giả lập bất cứ điều gì - chỉ cần gọi dịch vụ và xác nhận kết quả.

Bằng cách tách ra các thử nghiệm của bạn, bạn có quyền kiểm soát tốt hơn các lần chạy thử nghiệm. Ví dụ: bạn có thể chạy thử nghiệm đơn vị chạy nhanh của mình mỗi khi bạn thay đổi mã, nhưng chạy thử nghiệm chức năng chạy chậm hàng đêm, trên máy chủ chuyên dụng hoặc khi cần. Và khi một bài kiểm tra xảy ra, bạn sẽ biết liệu đó là mã của bạn hay có vấn đề gì đó với dịch vụ web.

+2

Tôi đã có các bài kiểm tra đóng hộp với trả lại giả ngay lập tức từ dịch vụ web. Câu hỏi này là về các bài kiểm tra tích hợp với dịch vụ web thực sự. Tôi thừa nhận rằng tôi có thể bỏ phần ứng dụng sang một bên, nhưng nó không thay đổi thực tế là tôi cần đợi kết quả bằng cách nào đó. Và: với kết quả đóng hộp, tôi không thử nghiệm có độ trễ giữa yêu cầu và kết quả, như với kết quả đã được đóng hộp, kết quả đại biểu thực sự được gọi là * trước khi cuộc gọi yêu cầu kết thúc. – fabb

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