php - 拉维尔 5 : Model->fill() ignores $fillable property in unit tests

标签 php unit-testing laravel phpunit laravel-5

我有一个具有以下验证规则的用户 Controller :

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 请求中发送 passwordpassword_confirmation 字段。

在开发过程中一切正常,但在单元测试中我遇到了数据库错误。它尝试将数据插入 password_confirmation 列。就像它忽略了 $fillable 数组一样。

我知道“laravel 在测试之间丢失事件处理程序”错误/问题(https://github.com/laravel/framework/issues/1181)。所以我认为除了 Model::boot()(我在测试中调用 User::boot() setUp() 函数)。

谢谢,

编辑

阅读 Model.php 源代码,我发现有人在调用 Model::unguard() https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L2180在 setUp() 函数之后和测试之前。如果我在测试开始时调用 User::reguard() 它会通过,但是(我不知道为什么),会多次调用 unguard() 和 reguard() 函数,并且测试变得非常慢。

最佳答案

发现问题:v5.0.x 中的 base seeder 只调用了 Model::unguard() ( https://github.com/laravel/laravel/blob/v5.0.22/database/seeds/DatabaseSeeder.php#L15 ) 而 v5.1.x 更新并添加了对 Model::reguard() 的调用 ( https://github.com/laravel/laravel/blob/v5.1.0/database/seeds/DatabaseSeeder.php#L19 ) (我使用的是 v5.0.22)。

关于php - 拉维尔 5 : Model->fill() ignores $fillable property in unit tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30940847/

相关文章:

javascript - 自动检测货币 PHP/Javascript

php - Klarna 与网上商店的整合

php - 为什么没有从我的 MYSQL 数据库中提取 "message"字段?

Laravel 和 Redis - 尽管超时设置为 1800 秒,但 10 分钟后作业被终止

php - 仅显示 15 个结果

javascript - 如何通过单元测试检查字符串是否恰好出现 1 次?

ruby-on-rails - 未初始化的常量 Test::Unit::TestResult::TestResultFailureSupport

perl - 需要 Perl 模块 Test::Simple 吗?

php - 当另一个表中值为 null 时重定向到页面 laravel

php - 拉维尔 |获取类别中的项目计数