這裡首先有一個問題要考慮的是,這類方法是否要被測試? 理論上,這類方法都會被其它public類型的方法調用,只要對那些public的方法做充分的測試,就可以保證這些方法的可靠性,就沒有必要再測了。好像是有道理的。 我們先看看好的單元測試的原則:(ATRIP) 自動化(Automatic) 徹底(Th ...
這裡首先有一個問題要考慮的是,這類方法是否要被測試?
理論上,這類方法都會被其它public類型的方法調用,只要對那些public的方法做充分的測試,就可以保證這些方法的可靠性,就沒有必要再測了。好像是有道理的。
我們先看看好的單元測試的原則:(ATRIP)
- 自動化(Automatic)
- 徹底(Thorough )
- 可重覆(Repeatable)
- 獨立(Independent )
- 專業(Professional)
對於測試private/protected方法來說,有另外三個附加原則:
- 透明(Transparency) - 不要改變測試下的系統(System Under Test ,SUT),例如,在產品代碼中增加包裝的方法.
- 範圍(Scope) - 可以在Debug和Release下運行
- 簡單(Simplicity) -最小的開銷,因此容易修改,並且非常簡單引入最小的風險.
正常情況下,PHP中只有標記為public的方法和屬性,才可以在外部被訪問,而protected/private方法都無法直接訪問。
對於protected的,簡單的方法是:通過創建一個子類並增加一個public的方法來包裹該protected的方法,即可通過這個子類的public方法來測試。
對於private的方法,則只能利用PHP的反射特性去訪問,protected的方法同樣也可以用反射實現訪問。PHPUnit中其實在Mock Objects部分就充分使用了該特性來攔截某些方法的返回值,以完成複雜場景的測試。