2013-11-20 77 views
2

好了 - 我的坎坷之旅的測試(與laravel)繼續...Laravel測試嘲笑對象的方法沒有找到

我已經創建了一個實例和一個「倉庫」,這我現在想測試。然而,在這樣做時,我得到一個錯誤,該類中的方法未找到。對我而言,這意味着這個班級至少被發現。

我加入以下到配置/ app.php:

//custom service providers 
    'GolfmanagerServiceProvider' 

我的服務提供商是:

class GolfmanagerServiceProvider extends ServiceProvider { 

    public function register() 
    { 
     $this->app->bind(
      'golfmanager\service\creator\TicketCreatorInterface', 
      'golfmanager\service\creator\TicketCreator' 
     ); 
     } 

    } 

我的界面:

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; 
    } 
} 
} 

TicketAudit是雄辯模型

我的測試,到目前爲止是:

public function testCreateTicketBindsTicketAuditFromRepository() 
{ 
// Arrange... 
$repository = Mockery::mock('TicketAudit'); 
$ticketCreator = Mockery::mock('TicketCreatorInterface'); 
$book = Mockery::mock('Book'); 
$repository->shouldReceive('create') 
    ->with(array(
     'ticketnumber'=>1000, 
     'status'=>'unused', 
     'active'=>1 
     ), $book) 
    ->times(2)->andReturn("true"); 
$book->shouldReceive('find')->once()->andReturn(1); 
App::instance('TicketCreatorInterface', $repository); 

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

// Assert... 
//still got to do this bit.... 
} 

我不知道應用程序實例是否應該存在 - 有,我已經通過該服務做到了這一點供應商?

我的錯誤是:

BadMethodCallException: Method TicketCreatorInterface::createTicket() does not exist on this mock object 

我很新的測試 - 而這種做法(創建接口),因此,教程和書籍都拿起位 - 這不是點擊尚未究竟應該是什麼像我一樣去學習

這次我犯了什麼愚蠢的錯誤?

我已經完成了作曲家更新,作曲家安裝和作曲家轉儲自動加載,但迄今爲止沒有效果。

回答

9

你嘲笑你的界面

$ticketCreator = Mockery::mock('TicketCreatorInterface');

和你模仿對象上調用createTicket()

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

但是,你忘了告訴嘲弄,該方法createTicket()將是叫,應該嘲笑:

$ticketCreator->shouldReceive('createTicket')->once()->andReturn($whatever);

+0

謝謝 - 那有效 - 我仍然試圖理解測試 - 你的解釋已經幫助再次感謝 – Ray