phpunit测试laravel创建对象和关系

时间:2013-11-21 19:55:18

标签: unit-testing phpunit laravel-4 eloquent

这个问题是我似乎正在产生的一个问题,因为我慢慢地通过学习测试。

我有一个书籍模型和一个票证审计模型。他们有一对一的关系。创建图书时,函数还应创建一系列票证(用于审计)。

我希望我的测试确保正在创建ticketAudit模型,并且使用laravel中的雄辩ORM进行关联。

到目前为止我的班级:

Class TicketCreator implements TicketCreatorInterface {

protected $ticket;

public function __construct(TicketAudit $ticketAudit)
{
    //dd($ticketAudit);
    $this->ticket = $ticketAudit;
}

public function createTicket($input, $book) {

    $counter = $input['start'];

    while($counter <= $input['end']) {

        $ticketDetails = array(
            'ticketnumber'=>$counter,
            'status'=>'unused',
            'active'=>1
            );

        $this->ticket->create($ticketDetails)->save();

        $this->ticket->book()->associate($book)->save();

        $counter = $counter+1;

    }
    return $counter;
}

}

我尝试测试:

public function testCreateCreatesTickets() {

    //arrange
 $book = FactoryMuff::create('Book');

 $aTicket = FactoryMuff::create('TicketAudit');

 $ticketAudit = new TicketAudit;

 $ticketCreator = new TicketCreator($ticketAudit);


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

// Assert...
 $this->assertEquals(true, $response);
 }

然而,当我运行此测试时,我收到错误:

Integrity constraint violation: 19 ticket_audits.ticketnumber may not be NULL

由于某种原因,我没有使用传递给它的值创建模型。我已经检查了该对象存在的函数以及在数组中正确创建的值,但它不起作用。

这是测试的独特之处吗?

我在内存数据库中为此测试创建了一个sqlite。

任何帮助表示赞赏

Crikey这个开始测试的决定有点像噩梦

1 个答案:

答案 0 :(得分:0)

感谢Manuel要求发布TicketAudit课程,我注意到我的模型扩展了Eloquent。我最近添加了Ardent并且应该扩展了Ardent,因此错误存在于模型中!

修订后的修正模型:

use LaravelBook\Ardent\Ardent;

class TicketAudit extends Ardent {
protected $guarded = array();

public $autoHydrateEntityFromInput = true; 
public $autoPurgeRedundantAttributes = true;

public static $rules = array(
    'status' => 'required',
    'ticketnumber' => 'required'
);

public static $factory = array(
    'ticketnumber' => '1000',
    'status' => 'unused',
);

public function book() {
    return $this->belongsTo('Book');
}
}

感谢您的路标