2013-11-20 127 views
1

仍然在學習如何測試PHPPHPUnit的測試功能

我現在有一個工作界面(我認爲) - 的功能之一是爲了創造出一系列的,我現在想測試是做記錄。我承認我對測試知之甚少,所以比知識有更多的問題。

所以

我的界面目前看起來是這樣的:

interface TicketCreatorInterface { 

public function createTicket($input, $book); 

} 

我的 '倉庫' 類看起來是這樣的:

Class TicketCreator implements TicketCreatorInterface { 

protected $ticket; 

public function __construct(TicketAudit $ticketAudit) 
{ 
    $this->ticket = $ticketAudit; 
} 

public function createTicket($input, $book) { 

    $counter = $input['start']; 

    while($counter <= $input['end']) { 

     $this->$ticket->create(array(
      'ticketnumber'=>$counter, 
      'status'=>'unused', 
      'active'=>1 
      )); 

     $this->ticket->book()->associate($book); 

     $counter = $counter+1; 

    } 

    return $counter; 



} 

而我試圖在測試看起來是這樣的:

public function testCreateCreatesTickets(TicketCreatorInterface $ticketCreator) { 

    //arrange 
    $book = Mockery::mock('Book'); 


    //act 
    $response = $ticketCreator->createTicket(array('start'=>1000, 'end'=>1001), $book); 

    // Assert... 
    $this->assertEquals(true, $response); 
} 

我首先嚐試沒有打印接口,因爲沒有收到沒有任何對象的錯誤。我試圖創建界面上的一個實例,但你不能這樣做,因此訴諸於功能

我得到的錯誤typehinting當我運行測試:

Argument 1 passed to TicketCreatorTest::testCreateCreatesTickets() must implement interface TicketCreatorInterface, none given 

創建界面是一種新的方法對我來說,所以還不完全瞭解它。

那麼我該如何測試這個函數是否按預期創建了一張票?

我在內存數據庫

回答

6

您需要在您的測試來調用該方法來創建你的TicketCreator的實例與源碼測試的模型。測試改成這樣:

public function testCreateCreatesTickets() { 

    //arrange 
    $book = Mockery::mock('Book'); 
    $ticketAudit = Mockery::mock('TicketAudit'); 
    $ticketCreator = new TicketCreator($ticketAudit); 


    //act 
    $response = $ticketCreator->createTicket(array('start'=>1000, 'end'=>1001), $book); 

    // Assert... 
    $this->assertEquals(true, $response); 
} 

既然你需要在你的構造函數TicketAudit,你還需要創建一個對象的模擬,並把它傳遞到您的構造函數。

PHPUnit爲測試用例提供參數的唯一時間是當您有數據提供程序或測試依賴於另一個測試時。

http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers

http://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.examples.StackTest2.php

請記住,你不創建一個接口的實例。如果我想確保你的對象實現了一個接口,我將創建一個測試來檢查對象是否是使用assertInstanceOf的接口實例。

+0

謝謝。這工作。我現在發現的問題是,因爲ticketAudit被嘲笑了一些需要該對象的功能,並且它的所有屬性都不再起作用。現在我的錯誤是'調用一個非對象的成員函數associate()有沒有辦法解決這個問題? – Ray

+0

我對Mockery不熟悉,但您需要在模擬中設置這些方法的行爲,以便僅測試TicketCreator類而不需要依賴ticketAudit功能。 – Schleis

+0

這個錯誤是因爲'book()'方法返回null。你需要設置你的嘲諷當這個值被調用時返回一些東西。儘管你這樣做的事實是一種代碼異味,你應該考慮改變你的代碼,以便你不需要讓模擬對象返回模擬對象。 – Schleis