以下测试失败:
/** @test */
public function set_shift_on_given_availability_to_a_candidate()
{
$candidate = $this->createCandidateWithFixedAvailability(pow(2, 3) - 1);
$candidate->availabilities[0]->setShift(App\Availability::SHIFT_TYPES['AM']);
$candidateShifts = $candidate->availabilities[0]->shifts;
$this->assertEquals(count($candidateShifts), 1);
$this->assertTrue(in_array('AM', $candidateShifts));
}
当我尝试使用工匠修补器的方法时,我得到了预期的结果:
>>> $candidate->availabilities()->first()->shifts();
=> [
"AM",
]
>>> $candidate->availabilities()->first()->setShift(App\Availability::SHIFT_TYPES['PM']);
=> null
>>> $candidate->availabilities()->first()->shifts();
=> [
"PM",
]
所用方法的实施细节:
public function setShift(...$shiftTypes)
{
\DB::table($this->table)
->where([
['candidate_id', '=', $this->candidate_id],
['day_of_week_id', '=', $this->day_of_week_id]
])
->update(['shifts' => array_sum ($shiftTypes)]);
}
public function shifts()
{
$namedShifts = [];
foreach (Availability::SHIFT_TYPES as $key => $val) {
if($this->shifts & $val) {
array_push($namedShifts, $key);
}
}
return $namedShifts;
}
我正在使用具有DatabaseTransactions特性的单独测试数据库。我不明白为什么当我尝试在单元测试中使用shifting()获取列值时,更新不会更改列值,而它与修补程序一起使用。
从我所看到的,使用数据库查询构建器更新列然后获取该列的动态属性并不反映更新更改,因此我要么使用查询构建器获取它,要么将移位值分配给更新成功运行时setShift函数中的动态属性。奇怪的是动态属性在修补程序中正确更新,但在phpunit中没有。
答案 0 :(得分:1)
您的测试设置与修补程序示例之间的主要区别在于{0: 1400, 1: 1400, 2: 1500, 3: 1400, 4: 1500, 5: 1000, 6: 1800}
与$candidate->availabilities()->first()
的使用。
$candidate->availabilities[0]
可能设置为返回$candidate->availabilities()
关系。因此,调用HasMany
将直接在数据库上执行SQL语句。
$candidate->availabilities()->first()
解析了$candidate->availabilities[0]
关系。这可能具有“副作用”,例如因为已经建立了关系,所以不会触发对DB的“新”调用。我想availabilities
不能按预期工作。也许您正在创建$this->createCandidateWithFixedAvailability(pow(2, 3) - 1);
而没有实际正确保存它们,因此未设置某些属性。此方案中的常见错误是缺少关系值(例如,未设置availabilities
实体中的candidate_id
属性。)
现在,这完全是猜测性的,纯粹基于我过去遇到的错误;)