【发布时间】: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