Laravel测试模拟对象方法未找到

时间:2013-11-20 09:56:17

标签: php laravel mocking phpunit laravel-4

好的 - 我进入测试的岩石之路(用laravel)继续......

我创建了一个实例和一个'存储库',我现在正在尝试测试它。但是,这样做我得到一个错误,即找不到类中的方法。对我而言意味着至少找到了这门课程。

我已将以下内容添加到config / 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

我对测试非常陌生 - 这种方法(创建界面)所以一直在从教程和书籍中汲取一些东西 - 它并没有点击这里应该发生什么,就像我去学习一样

这次我犯了什么愚蠢的错误?

我已经完成了作曲家更新,作曲家安装和作曲家转储自动加载但到目前为止没有效果。

1 个答案:

答案 0 :(得分:9)

你嘲笑了你的界面

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

并且您在该模拟对象上调用了createTicket()

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

然而,你忘了告诉Mockery将调用方法createTicket()并且应该被嘲笑:

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