【发布时间】:2015-06-20 02:03:49
【问题描述】:
我有一个具有以下验证规则的用户控制器:
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());
...
}
我的 User.php 模型将可填充属性定义为:
protected $fillable = ['name', 'email'];
要通过 confirmed 验证,我必须在 POST 请求中同时发送 password 和 password_confirmation 字段。
在开发过程中一切正常,但在单元测试中我遇到了数据库错误。它尝试将数据插入到 password_confirmation 列中。这就像它忽略了$fillable 数组。
我知道“laravel 在测试之间丢失事件处理程序”错误/问题 (https://github.com/laravel/framework/issues/1181)。所以我认为除了Model::boot()(我在测试的setUp() 函数中调用User::boot())之外,我可能缺少调用一些模型函数。
谢谢,
编辑
阅读 Model.php 源代码,我发现有人在 setUp() 函数之后和测试之前调用 Model::unguard() https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L2180。如果我在测试开始时调用User::reguard(),它会通过,但是(我不知道为什么),unguard() 和 reguard() 函数会被多次调用,并且测试变得非常慢。
【问题讨论】:
标签: php unit-testing laravel phpunit laravel-5