2009-12-07 81 views
1

我有類似如何在XCode中異步返回結果的單元測試函數?

- (void)getData:(SomeParameter*)param 
{ 
    // Remotely call out for data returned asynchronously 
    // returns data via a delegate method 
} 


- (void)handleDataDelegateMethod:(NSData*)data 
{ 
    // Handle returned data 
} 

我想寫這個單元測試,我該怎麼做更好的東西比

NSData* returnedData = nil; 

- (void)handleDataDelegateMethod:(NSData*)data 
{ 
    returnedData = data; 
} 

- (void)test 
{ 
    [obj getData:param]; 
    while (!returnedData) 
    { 
     [NSThread sleep:1]; 
    } 
    // Make tests on returnedData 
} 

回答

1
  1. 讓你的對象調用,將其從一個模擬getData:方法並檢查它是否正確呼叫。

  2. 從另一個測試中調用handleDelegateMethod:方法,使用一些已準備好的數據,並確保它對給定的數據執行任何操作。

+0

Chuck正確 - 調用是異步無關緊要 - 這是其他一些依賴的行爲。對你來說測試的重要之處在於調用getData:調用它的依賴關係,而handleDelegateMethod:處理所有你可以預測的各種條件。 – 2010-07-10 05:27:31

1

如果模擬數據不能發送回您的委託作爲查克說,你可以做到以下幾點:

  1. 使測試的委託,使其 接收回調。

  2. 將字段添加到您的測試類callBackInvoked和errorHasOccurred。將它們都設置爲NO。

  3. 進行調用getData

  4. 去各地主要runloop,爲 如下:

    NSDate *twoSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:2.0]; 
    while (!callBackInvoked && !errorHasOccured && runCount-- && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:twoSecondsFromNow]) { 
        twoSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:2.0]; 
        } 
    

    (可以設置runCount你認爲這是合理的等待的次數)。

  5. 在你的handleDataDelegateMethod在測試類中設置callBackInvoked爲YES。同樣,如果你有一個錯誤回調,你可以將errorHasOccured設置爲YES。

  6. 然後,您的測試應該斷言callBackInvoked爲YES且erroHasOccurred爲NO。

相關問題