【问题标题】:Laravel 5/Faker - Factory data changesLaravel 5/Faker - 工厂数据更改
【发布时间】:2016-08-18 11:57:09
【问题描述】:

最近一直在使用 Faker 和 sqLite 内存数据库在 Laravel 中进行测试,我遇到了一个奇怪的问题,我的模型有一个工厂,除了第一个变量(恰好也是表的主键)之外的所有内容设置正确。

让我们进一步解释一下,我指向的变量在工厂中使用以下规则:

'kvk' => strval($faker->randomNumber(9)),

所以它应该变成一个包含 9 位数字的字符串。现在下一步是从我的控制器测试中调用工厂,我还有另一个用户模型,它使用我公司的这个“kvk”变量作为外键引用:

$this->_company = factory(Company::class)->create([ 'address_id' => $this->_address->id ]); 
$this->_user = factory(User::class)->create([ 'kvk' => $this->_company->kvk ]); 

但是当我放一个 echo $this->_company->kvk;在这两者之间,它告诉我'kvk 设置为1,由于我在工厂中设置的规则,这应该是不可能的。

最后,用户用于在测试中模拟会话,还用于检查我是否应该有权使用以下检查来编辑地址:

$user = Auth::user(); 
$company = Company::where('kvk', $user->kvk)->first(); 
$address = Address::whereId($id)->first();

if($company->address_id != $address->id)
{ 
    return abort(403); 
} 

所以首先我得到当前登录的用户(它被模拟到上面创建的用户,这很好用。接下来我得到与这个用户关联的公司(应该是上面创建的那个,因为我使用了公司->kvk 作为外键引用),但是当我将保存的公司输出到我的日志时,我看到 kvk 被设置为一个 9 位字符串,就像它应该的那样。

我真的无法解释为什么一开始 kvk 设置为 1,然后在我的测试中它看起来完全正常,但我的测试失败了,因为在我的用户中设置了错误的引用所以它找不到合适的公司。你知道这可能是什么原因吗?我还尝试在使用工厂创建时明确设置“kvk”,但这也不起作用,仍然会输出 1。

【问题讨论】:

    标签: unit-testing laravel factory faker


    【解决方案1】:

    在深入了解 Laravel 的源代码后,我发现它与我的模型有关。虽然我确实在模型中设置了主键属性,但我忘记将自动增量布尔值设置为 false。这导致我的模型每次将主键保存到数据库时都将其转换为自动递增整数。这解决了问题。

    【讨论】:

      猜你喜欢
      • 2021-06-29
      • 1970-01-01
      • 2015-06-09
      • 2017-10-09
      • 2015-04-20
      • 2021-05-03
      • 2018-05-01
      • 2019-07-21
      • 2019-04-11
      相关资源
      最近更新 更多