2012-11-09 39 views
3

[編輯]:Click here在適當的網站的問題。當TDD測試揭示需要測試的新功能時該怎麼辦?

當你正在編寫一個測試時,你會做什麼,你到了需要讓測試通過的地步,並且你意識到你需要一個額外的功能應該被分離到它自己的功能?該新功能也需要進行測試,但TDD週期表示要使測試失敗,並使其通過重構。如果我正在嘗試使我的測試通過,那麼我不應該開始另一個失敗的測試來測試我需要實現的新功能。

例如,我寫了一個函數WillCollideWith(線段點類:

public class Point { 
    // Point data and constructor ... 

    public bool CollidesWithLine(LineSegment lineSegment) { 
     Vector PointEndOfMovement = new Vector(Position.X + Velocity.X, 
               Position.Y + Velocity.Y); 
     LineSegment pointPath = new LineSegment(Position, PointEndOfMovement); 
     if (lineSegment.Intersects(pointPath)) return true; 
     return false; 
    } 
} 

我在寫一個測試CollidesWithLine當我意識到我需要一個LineSegment.Intersects(LineSegment函數。但是,我應該停止在測試循環中執行的操作來創建這個新功能嗎?這似乎打破了「紅色,綠色,重構」的原則。

我是否應該只是編寫檢測lineSegments交點內部的CollidesWithLine函數的代碼,並在其工作後對其進行重構?在這種情況下,這可以起作用,因爲我可以訪問LineSegment中的數據,但是如果這種數據是私密的,那麼情況如何呢?

+0

OT here;嘗試程序員。 – 2012-11-09 17:11:41

回答

0

我喜歡使用[Ignore]屬性來標記需要注意的測試(例如,當它未完成時)。這種測試不會運行。忽略的測試在測試跑步者中突出顯示(通常是黃色或橙色)。即使所有其他測試都通過了,在出現任何被忽略的測試時也不會看到綠線。這確保測試不會被遺忘。

1

我建議你最好的選擇是嘲笑它,這樣你留在你的工作流程中,你也一次測試有限的代碼量。

2

如果您按照Kent Beck在他的書中對它的定義跟隨TDD,當您遇到某些您需要測試的內容時,請在一張紙上記下它(他指的是這個作爲測試列表),然後關注當前的測試。肯特建議你應該一次完成一項測試。

從你應該集中精力使測試通過,其中有幾個選項的測試第一視角:

  1. 寫相交內嵌在當前方法的實現。 「綠色」意味着工作,而不是漂亮。一旦工作,重構代碼和測試。

  2. 擱置它。將測試雙(模擬)傳入可以模擬合同的方法。

  3. 假的。當你遇到你需要的方法時,爲其他測試做一個註釋,然後寫一個基本的實現(例如「返回true」)

+0

如果我編寫了一個可以僞裝它的方法(返回true),那麼當我爲該方法編寫測試時,我可以編寫一個測試來檢查該方法是否返回true。在這種情況下,測試會馬上通過蝙蝠。沒有「紅色,綠色,重構」,只有「綠色,重構」。 –

+0

是的。但是如果一個測試通過了,而且我沒有編寫任何代碼來支持它,那麼這個測試就是錯誤的假設。爲了防止這種情況,我故意破壞代碼以確保測試首先失敗。更少的是誤報。在僞造實現的情況下,假設實現將隨着我編寫更多測試而發生變化。 – bryanbcook