好吧-我的测试之旅(与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
我对测试很陌生——这种方法(创建界面)一直在从教程和书籍中学习——它还没有点击这里到底应该发生什么,就像我在中学习一样
这次我犯了什么愚蠢的错误??
我已经完成了composer更新、composer安装和composer转储自动加载,但到目前为止没有效果。
您已经嘲笑了您的界面
$ticketCreator = Mockery::mock('TicketCreatorInterface');
你在那个模拟对象上调用了createTicket()
$response = $ticketCreator->createTicket(array('start'=>1000, 'end'=>1001), $book);
但是,您忘记告诉Mockery方法createTicket()
将被调用,并且应该被模拟:
$ticketCreator->shouldReceive('createTicket')->once()->andReturn($whatever);