我有兩個班,親子:取決於遺傳測試
class Parent
{
public function parentAction() {...}
}
class Child extends Parent
{
public function childAction() {...}
}
現在我使用PHPUnit進行測試這些。 (我不是真正的單元測試,但對這個問題的目的,我想你可以認爲我是我做這與這些測試類:
abstract class ParentBaseTest extends PHPUnit_Framework_TestCase
{
public function testParentAction() {...}
protected function factoryMethod()
{
return new Parent();
}
}
class ParentTest extends ParentBaseTest
{
}
class ChildTest extends ParentBaseTest
{
protected function factoryMethod()
{
return new Child();
}
public function testChildAction() {...}
}
背後這裏使用繼承與想法factoryMethod是在不重寫Parent的測試的情況下,ParentBaseTest的測試也會在Child上運行,換句話說,測試是Child是否正確地遵守Liskov的替代原則。使用抽象基類和空的繼承類是必要的,因爲PHPUnit不想運行你的基類測試兩次否則。
以上所有的作品。但是,現在我想添加一個依賴testParentAction()
testChildAction()
(即在testChildAction()
定義之前添加/** @depends testParentAction */
)。
這不起作用。由於PHPUnit不會改變運行測試以滿足依賴性的順序,並在運行測試之前運行ChildTest
中定義的測試,所以它將繼續從ParentTest
繼承,它總是會導致跳過testChildMethod()
。
是否有可能強制PHPUnit先運行繼承的測試?或者是否有另一種(乾淨)的方式來強制依賴?
@Jasper:我認爲你誤讀了markdrake,並且你誤解了更基本的東西:這裏沒有人需要向你解釋任何東西。我會說這種不同的說法,你不能理解答案。所以它不太關於理想世界或不那麼理想的世界,但更多的是關於已經回答的問題:兩個單元測試都需要單獨測試這兩種類型。期。運行隔離的測試來測試這些對象。如果這兩種類型之間存在隱藏的依賴關係,請修復該問題。這就是你測試的原因。 – hakre
@hakre你對我的措辭和語調絕對正確。我會重新評論我的評論。 – Jasper
正如我所看到的,遵循Liskov替換原則,您應該能夠運行您爲您的子類上的父類編寫的測試。你說爲此使用工廠方法是沒有意義的,但是我不明白工廠方法會如何導致測試錯誤的東西。我也不明白爲什麼測試之間不能有依賴關係。當您測試使用您正在測試的功能的某些內容時,如果對使用的功能的原始測試失敗,則標記此測試將跳過,這意味着您可以更好地查明代碼中的問題。 – Jasper