2015-10-08 26 views
2

我想單元測試我所有的目錄實體方法,並在測試getter getId()時遇到問題。 當我創建目錄(新目錄())時,沒有設置Id並且沒有setId()方法!如何在Symfony2 ORM實體上單元測試getId()方法?

我的第一個愚蠢的一步是寫的MOK:

public function testGetId() 
{ 
    $category = $this->getMock('\Dimas\CatalogBundle\Entity\Category'); 
    $category->expects($this->any()) 
     ->method('getId') 
     ->will($this->returnValue(352)); 
    $this->assertEquals(352, $category->getId()); 
} 

但是這種虛擬測試不測試我的實體!

測試getId()方法的正確方法是什麼?

+0

你想測試getId()方法麼?如果你在setId方法中有一些困難的邏輯,那麼測試getId方法是有意義的。但是直到它從盒子實現中學到了爲什麼你需要它來測試呢? – Alex

+0

像@亞歷克斯說,爲什麼要麻煩?測試簡單的getter/setter通常是浪費時間。但是如果你真的想用反射http://php.net/manual/en/book.reflection.php來設置這個值,而不需要添加一個setId方法。 – Cerad

+0

是的,除非你在setter或getter中有不尋常的行爲,否則它是沒有意義的(除非它不僅僅是一個映射)。 – Alex

回答

1

如果您已經生成了ID(通過Doctrine,數據庫自動增量或其他),您將測試Doctrine(等)代碼。

要正確測試getId(),您必須通過構造函數(首選項)或setter自己設置ID。

我個人更喜歡使用UUID的第二種方法。你可以找到更多的信息with example here

+0

謝謝你的回答。我的ID被映射爲@ORM \ GeneratedValue(strategy =「AUTO」) 當我嘗試在__constructor() 類中設置id時, ID; }' 然後在測試中 '$ category = new Category(352);' id仍然爲空。 有沒有辦法設置ID? – Psyhos

+0

生成時手動設置它沒有意義。刪除「GeneratedValue」註釋或使用構造函數。 你描述的代碼應該可以工作,你能提供實體和測試用例的完整代碼嗎? –