2013-08-04 41 views
1

我正在寫一些測試,在這裏我需要無法存根模擬CLLocation對象上時間戳獼猴桃

  • 存根到一個模擬CLLocationManager調用返回一個特定的 CLLocation
  • ,進而這CLLocation需要有一個時間戳 是CLLocation過去

創建情況下是很容易的,但它的時間戳屬性爲只讀和固定的時間點創建實例時。 因此,我計劃創建一個模擬CLLocation,並存根時間戳調用。

所以,代碼如下:

[[CLLocationManager stubAndReturn:theValue(YES)] locationServicesEnabled]; 
NSDate *oldDate = [IPPOTestSupportMethods createNSDateSubtractingDays:2]; 
//TODO - Why is line below failing 
[[expectedOldLocationMock stubAndReturn:oldDate] timestamp]; 
[[locationMgrMock stubAndReturn:expectedOldLocationMock] location]; 

總之,我有一個CLLocationManager模擬,創建一個NSDate比今天早些時候兩天。我想被返回的日期,當我打電話

[cllocationmock timestamp]; 

但是,我越來越和ARC語義問題。

IPPOLocationManagerDelegateImplKiwiTests.m:203:33: Multiple methods named 'timestamp' found with mismatched result, parameter type or attributes 

這是獼猴桃的問題,還是我錯過了什麼?

回答

1

我能夠通過選擇磕碰技術,而不是消息模式技術,使這項工作:

[expectedOldLocationMock stub:@selector(timestamp) andReturn:oldDate]; 

我得到同樣的錯誤,你使用的消息模式技術(stubAndReturn:)時:

發現不匹配的結果,參數類型

名爲「時間戳」多種方法或屬性

如果您檢查在問題導航這個錯誤,你應該看到它指向的是聲明timestamp選擇兩個不同的類:類UIAcceleration聲明

@property(nonatomic,readonly) NSTimeInterval timestamp; 

...和類CLLocation聲明

@property(readonly, nonatomic) NSDate *timestamp; 

注在「消息模式」磕碰技術的結構:

[[someObject stubAndReturn:expectedValue] messageToStub] 

stubAndReturn:方法返回鄰類型爲id的帕奎克對象。因此,它是相同的:

id invocationCapturer = [someObject stubAndReturn:expectedValue]; 
[invocationCapturer messageToStub]; 

這裏, 「messageToStub」 是你timestamp選擇。所以你說要發送消息timestamp到類型爲id的未知對象。由於在編譯時我們沒有對發送時間戳選擇器的對象的類型進行斷言,它不能知道你的時間戳屬性的版本是什麼,因此它不能確定正確的返回類型。

您可以通過簡單地做這重現了同樣的錯誤:

id someUnknownObject; 
[someUnknownObject timestamp]; 

的結論是,當有相同的選擇名字的可見不同聲明的消息模式磕碰技術只是將無法正常工作。

+0

謝謝。這對我來說很有用。也感謝您的解釋。我正在使用stubAndReturn方法,因爲我個人發現它更具可讀性。所以,解釋清楚了爲什麼我不能使用它。 –

+0

[stubAndReturn](https://github.com/allending/Kiwi/wiki/Mocks-and-Stubs)確實有時看起來更具可讀性,並且它的優點是可以針對特定組合的參數值。 –

相關問題