【问题标题】:phpunit test laravel creating object and relationshipphpunit 测试 laravel 创建对象和关系
【发布时间】:2013-12-06 11:50:16
【问题描述】:

这个问题是我在通过学习测试慢慢选择方法时产生的一系列问题中的一个。

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

我希望我的测试确保正在创建 ticketAudit 模型,并使用 laravel 中的 eloquent 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。

任何帮助表示赞赏

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

【问题讨论】:

  • 我不确定这是否能解决任何问题,但在你的测试中你有:$ticketCreator = new TicketCreator($ticketCreator);。不应该是$ticketCreator = new TicketCreator($ticketAudit);吗?
  • 嗨 - 是的,你的权利 - 我在玩不同的方法 - 我已经将上面的代码更新到当前位置 - 代码失败并出现上述错误
  • 你也可以发布你的TicketAudit课程吗?
  • 正准备将模型添加到帖子并发现错误。我最近添加了 ardent 并忘记了让模型在课堂上扩展 ardent 而不是 eloquent。在下面回答。

标签: unit-testing phpunit laravel-4 eloquent


【解决方案1】:

感谢 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');
}
}

感谢您的签名

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 2010-10-07
    • 2021-12-07
    • 2013-05-14
    • 2016-04-26
    • 2013-06-21
    • 2017-11-29
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多