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数组,但在测试中不尊重。