2011-12-11 31 views
1

我想爲延遲調用另一個方法的方法編寫黑盒單元測試。這有點類似於:單元測試Objective-C中延遲的方法

- (void) doSomething { 
    // Do something 
    [self performSelector:@selector(doSomethingLater) withObject:nil afterDelay:kDelay]; 
} 

- (void) doSomethingLater { } 

kDelay是一個常數,doSomethingLater是私人的。問題是kDelay是1秒,我不想減慢單元測試的執行速度。

單元測試doSomething在黑箱方法下(或儘可能)的最佳方式是什麼?

唯一想到的是在類中添加一個方法來更改kDelay的值,但這可能會被其他開發人員意外地使用。是否有一種侵入性較小的選擇?

回答

0

我不知道它是否侵入性較小,但是您可以使用不會延遲的自己版本調整-[NSObject performSelector:withObject:afterDelay:]方法。

Swizzling意味着在運行時替換方法實現。退房免費JRSwizzle library

+0

我想我會說它是以不同的方式侵入。 –

+0

這種方法的問題是,如果由於某種原因有人決定改變performSelector延遲的另一種方法,那麼測試會變得緩慢,沒有人會知道爲什麼。 – hpique

+0

雖然,能夠調整常量會很好。 – hpique

0

我要看的第一件事就是檢測該方法是否已執行。就像@Rob說的那樣,我會用另一種方法來調整。可能是一個本地的測試,設置一個布爾表明它已被稱爲。

下一個問題是減少延遲。由於KDelay是一個常數,你無法對它做任何事情。您可以將其更改爲私有財產或您可以在測試和設置中訪問的內容,但對於生產代碼仍然是私有財產。

另一個選項(我沒有看過,看看是否可能!)是不用擔心檢測正在執行的方法,而是考慮是否可以檢測到該調用是運行循環堆棧,等待被執行。如果您可以檢測到掛起呼叫的存在而不是呼叫本身,那麼您可以立即做到這一點,延遲變得無關緊要。

0

您的測試是否需要確保doSomethingLater被調用,並且它做到了它應該做的,並且您所要做的只是縮短時間延遲?如果是這樣,我建議你創建一個私有方法,返回doSomething的常量值。喜歡的東西:

@implementation MyClass 

- (NSUInteger) getDelay { 
    return kDelay; 
} 

@end 

然後,您可以存根出getDelay的在運行時使用的東西像OCMock其他測試框架的各種功能的實現。