好的 - 我进入测试的岩石之路(用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
我对测试非常陌生 - 这种方法(创建界面)所以一直在从教程和书籍中汲取一些东西 - 它并没有点击这里应该发生什么,就像我去学习一样
这次我犯了什么愚蠢的错误?
我已经完成了作曲家更新,作曲家安装和作曲家转储自动加载但到目前为止没有效果。
答案 0 :(得分:9)
你嘲笑了你的界面
$ticketCreator = Mockery::mock('TicketCreatorInterface');
并且您在该模拟对象上调用了createTicket()
$response = $ticketCreator->createTicket(array('start'=>1000, 'end'=>1001), $book);
然而,你忘了告诉Mockery将调用方法createTicket()
并且应该被嘲笑:
$ticketCreator->shouldReceive('createTicket')->once()->andReturn($whatever);