Ray*_*Ray 1 php phpunit unit-testing interface
还在学习如何测试php
我现在有一个工作界面(我认为) - 其中一个函数旨在创建一系列记录,我现在想要测试它.我承认我对测试知之甚少,所以问题多于知识.
所以
我的界面目前看起来像这样:
interface TicketCreatorInterface {
public function createTicket($input, $book);
}
Run Code Online (Sandbox Code Playgroud)
我的'repository'类看起来像这样:
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;
}
Run Code Online (Sandbox Code Playgroud)
我在测试中的尝试看起来像这样:
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);
}
Run Code Online (Sandbox Code Playgroud)
我首先尝试没有输入接口,因为我没有得到任何对象的错误.我尝试在界面上创建一个实例,但你不能这样做,所以在函数中使用了typehinting
我运行测试时得到的错误是:
Argument 1 passed to TicketCreatorTest::testCreateCreatesTickets() must implement interface TicketCreatorInterface, none given
Run Code Online (Sandbox Code Playgroud)
创建接口对我来说是一种新方法,所以还不了解它的全部内容.
那么如何测试此功能是否可以按预期创建票证?
我在内存数据库中测试了带有sqlite的模型
您需要在测试中创建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);
}
Run Code Online (Sandbox Code Playgroud)
由于您在构造函数中需要TicketAudit,因此您还需要创建该对象的模拟并将其传递给构造函数.
PHPUnit为测试用例提供参数的唯一时间是您拥有数据提供者或测试依赖于另一个测试.
请记住,您不创建接口的实例.如果我想确保你的对象实现了一个接口,我将创建一个测试,检查该对象是否是一个接口的实例assertInstanceOf.