2017-01-27 91 views
1

我正在嘗試爲我的存儲庫編寫集成測試。對於簡單的存儲庫來說,這似乎很容易。我做了這樣的事情如何正確測試php存儲庫

class DBStatusRepositoryTest extends SmBaseIntegrationMemory 
{ 
    private $dbStatusRepository; 

    public function setUp() 
    { 
     parent::setUp(); 

     $this->dbStatusRepository = new DBStatusRepository($this->dbConnection); 
    } 

    public function testShouldReturnAStatusEntity() 
    { 
     $status = $this->dbStatusRepository->getById(1); 
     $this->assertInstanceOf('Acme\Modules\Foo\Model\Status', $status); 
    } 
} 

查詢狀態庫應該返回一個狀態實體。

但我不知道如何處理更加複雜的倉庫像這樣的:

public function testAddAttachment() 
{ 
    $itemId = 420807; 
    $user = new User([//** data ** //]; 
    $attachment = new Attachment(); 
    $attachment->setUser($user); 
    $attachment->setSomething('something'); 
    $attachment->set....; 

    $this->dbAttachmentRepository->addAttachmentForItem($itemId, $attachment); 
    $attchments = $this->dbAttachmentRepository->getAllForLead($itemId); 
    $this->assertCount(1, $attchments); 
} 

這段代碼也測試全部通過的依賴。我不確定這是否正常。

而且設置當資源庫,我們可以有依賴性的這樣的樹:

$userRepository = new DBUserRepository($this->dbConnection); 
$attachmentFactory = new AttachmentFactory($userRepository); 
$this->dbAttachmentRepository = new DBAttachmentRepository($this->dbConnection, $attachmentFactory); 

這是執行對倉庫集成測試是正確的做法?

更新:爲了更具體我已經使用DBUnit和內存sqlite數據庫,每次運行測試文件時都會被填充。但是,我的問題涉及是否可以實例化某些與存儲庫相關的操作所需的所有依賴項。

感謝

回答

0

其實,據我瞭解,在集成測試,你想與真正的邊界,以測試你的存儲庫。

因此,不是創建對象並將它們放入存儲庫,而是直接在數據庫中插入數據,測試是否可以獲取數據並將其從數據庫中刪除。

您可以手動或通過在每次測試之前使用DBUnit的

做到這一點,你做直接插入,存儲插入的ID,然後使用存儲庫來檢索數據並使用存儲的ID來清理數據庫之後。

使用DBUnit,您可以創建定義數據的XML/CSV/YAML文件,並且DBUnit自動爲您創建插入和清理。

https://phpunit.de/manual/current/en/database.html

+0

我正在使用的內存sqlite的測試數據庫和DbUnit和我填充虛擬數據的數據庫。然而,不是讀取數據,我想測試數據的插入。請看我上面的第二個例子。我的問題是如何處理具有依賴關係樹的存儲庫。 – rungurean

+0

我只是反映了我對PHPUnit的手動測試。 讓我們假設你不會使用測試,你會如何測試你的插入?你會檢查數據庫,看看是否有預期的條目。 因此,在「addAttachmentForItem」之後,我只需將普通的SQL請求調用到特定的表並檢查值。也許在預期的stdClass之前創建更容易的補償 –

+0

這正是我所做的。 $ attchments = $ this-> dbAttachmentRepository-> getAllForLead($ itemId); 將查詢執行到內存中測試數據庫。同樣,我的問題涉及附件實體和用戶實體!爲什麼DBAttachmentRepositoryTest類的作用是測試/實例化這些? – rungurean