2011-09-05 120 views
5

我使用OCMock測試真正的Web服務調用。延遲OCMock驗證/在單元測試中處理超時

現在我正在做的東西

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

它工作正常,但它意味着,每一個這樣的測試將需要2秒。

有沒有一種方法可以設置例如超時2秒,並立即致電someMethodmydelegatemockverify並完成測試用例?

回答

5

我做到這一點使用一個方便實用的功能,我發現at this link

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

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

和實現:

#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 

這讓我等待,最多延遲時間(以秒爲單位),而不每次等待全額。

+2

也許發源於此? ... http://touchalicious.com/blog/2009/11/5/asynchronous-unit-testing-with-ocmock.html –

+1

感謝Max - 這看起來像來源。我已經更新了原始回覆並附上原始鏈接。 –

1

我會從處理Web服務結果的類的單元測試中分離出您的Web服務的功能測試(如果您需要這樣做的話)。

要進行單元測試,您應該模擬Web服務調用,提供模擬結果。然後,您的測試將驗證,對於定義良好的結果,您的班級相應地執行相應操作。

如果您還想對您的Web服務進行功能測試(例如,在給定某個請求時返回特定響應),則不需要嘲笑任何內容 - 只需調用該服務並對結果進行斷言即可。

通過分離您的測試,您可以更好地控制測試運行。例如,每次更改代碼時都可以運行快速運行的單元測試,但每晚在專用服務器上或根據需要運行慢速運行的功能測試。當測試中斷時,您會知道它是您的代碼還是Web服務的錯誤。

+2

我已經有了來自Web服務的立即假返回的測試。這個問題是關於與真實Web服務的集成測試。我承認我可以將應用程序部分留在那些部分,但這並沒有改變我需要以某種方式等待結果的事實。並且:對於預先設定的結果,我不會測試請求與結果之間的延遲,就像對於預設結果一樣,結果委託在請求調用完成之前實際上被稱爲*。 – fabb