2013-03-07 61 views
5

我有一個按鈕按下時觸發動畫,動畫完成後,更改標籤的文本。我想寫一個測試,驗證按鈕被按下後,標籤的文本最終會正確更改。iOS TDD:測試使用UIVIEW的方法animateWithDuration:動畫:完成:

執行按鈕IBAction將使用[UIView animateWithDuration:animations:completion:]。我顯然不希望我的單元測試等待0.5秒來完成動畫。

我想過嘲笑UIView,但將UIView作爲依賴項注入視圖控制器看起來很奇怪。此外,我正在使用的嘲笑框架(OCMockito)似乎不適用於嘲笑類方法。

我也考慮過方法調試或編寫UIView的測試類別,並使用一個實現除了調用animations:塊和completion:塊之外什麼也不做。這對我來說似乎有點失敗;我擔心覆蓋UIView上類方法的實現可能會產生意想不到的後果。

作爲TDD的新手,我不確定最佳實踐在這裏。這是應該被視爲「UI twiddling」的代碼段之一,因此未經測試可以接受嗎?還是有一些更明顯的方式來測試我錯過了嗎?

回答

4

我只需製作一個屬性即可確定動畫的長度,並將其默認爲0.5秒。

這樣,您的測試可以將動畫持續時間設置爲0,並觀察標籤的文本已更新而無需等待。

這是dependency injection,如果你剛開始使用TDD,它非常有用。它還具有使代碼更加模塊化和更少耦合的良好副作用。

+0

對此很好奇:有沒有保證測試完成之前動畫會運行?這個動畫片段會因某種原因而被推遲嗎? – Ying 2013-03-07 21:19:30

+1

這實際上是一個很好的觀點。動畫將在runloop上排隊,這通常意味着動畫將在測試返回後發生。但是,持續時間<= 0的動畫是一種特殊情況,會導致立即發生更改。 – 2013-03-07 21:26:58

+1

@Benoit將動畫的持續時間設置爲0或更少不會立即調用完成塊。即使持續時間爲0,也可能在下一次運行循環中調用該塊。我所做的就是調用GCD延遲塊內的斷言。我做了一個單獨的答案來解釋我的解決方案。 – 2015-04-21 09:54:48

相關問題