Laravel-单元测试模型保存


Laravel - Unit Testing Model Save

我正在努力模拟Laravel中的保存函数进行测试。 我有一个saving()事件,我正在尝试测试。 我尝试使用Eloquent::shouldReceive('save')但它给出了一个致命错误:Fatal error: Cannot instantiate abstract class Illuminate'Database'Eloquent'Model.

这是我到目前为止的测试:

public function testRemoveAttributesOnSave(){
    Eloquent::shouldReceive('save')->once()->andReturn(true);
    $this->model->attributeA=1;
    $this->model->attributeB=2;
    $this->model->save();
    $this->assertTrue(!isset($this->model->attributeB));
}

我想写的是对测试的不言自明。 我正在尝试处理模型中的验证,并保护某些属性在保存后不被包含。

如果我做错了,请告诉我。

我进行了搜索,并在SO的评论中找到了答案

当您使用模型事件 ( public static function boot() ) 时,PHPUnit 不会注册这些事件,并且它们将被忽略。 现在还有待回答,这是PHPUnit的错还是Laravel的错,但希望这是在未来版本中解决的问题。

要解决此问题,您需要在单元测试中手动调用 boot() 方法,并且可以在 setUp() 中执行此操作:

public function setUp(){
    parent::setUp();
    Artisan::call('migrate');
    $this->seed();
    $this->model=new User;
    User::boot();
}

希望这可以帮助任何使用 Laravel 并进行单元测试的人。