Php Laravel 5:型号->;fill()忽略单元测试中的$fillable属性

Php Laravel 5:型号->;fill()忽略单元测试中的$fillable属性,php,unit-testing,laravel,phpunit,laravel-5,Php,Unit Testing,Laravel,Phpunit,Laravel 5,我有一个具有以下验证规则的用户控制器: public function store(Request $request) { ... $this->validate($request, [ 'name' => 'required', 'email' => 'email|required|unique:users', 'password' => 'confirmed|max:32|min:8|required',

我有一个具有以下验证规则的用户控制器:

public function store(Request $request)
{
    ...
    $this->validate($request, [
        'name' => 'required',
        'email' => 'email|required|unique:users',
        'password' => 'confirmed|max:32|min:8|required',
        'roles' => 'exists:roles,id|required',
    ]);

    $user = new User();
    $user->fill($request->all());
   ...
}
My User.php模型将可填充属性定义为:

protected $fillable = ['name', 'email'];
要通过
确认
验证,我必须在POST请求中发送
密码
密码确认
字段

在开发过程中,一切正常,但在单元测试中,我得到了一个数据库错误。它尝试将数据插入密码确认列。就像它忽略了
$filleble
数组一样

我知道“laravel在测试之间丢失事件处理程序”bug/issue()。因此,我认为除了调用
model::boot()
(我在测试的
setUp()
函数中调用
User::boot()
)之外,可能我没有调用一些模型函数

谢谢

编辑
阅读Model.php源代码,我发现有人在setUp()函数之后和测试之前调用
Model::unguard()。如果在测试开始时调用
User::reguard()
,它会通过,但是(我不知道为什么),unguard()和reguard()函数会被多次调用,测试会变得非常慢。

filleble只适用于MassaSignment。创建新实例时,如上面所述,不会触发体量指定事件

你可以这样做: 如果仍要创建用户,则不妨执行以下操作:

$user = User::create($request->all);
如果只想实例化用户,而不持久化数据,可以执行以下操作:

$user = new User($request);

发现问题:v5.0.x中的基本播种器只调用了Model::unguard()(),而v5.1.x被更新并添加了对Model::reguard()的调用(我使用的是v5.0.22)。

调用
Model::create($attributes)
最终调用
Model::fill()
函数。问题是它在dev中尊重$filleble数组,但在测试中不尊重。