Menguji kesaksamaan antara lajur JSON dalam Laravel memerlukan pertimbangan khusus kerana data JSON disimpan sebagai rentetan dalam pangkalan data. Perbezaan dalam cara JSON dikodkan boleh membawa kepada kegagalan ujian yang tidak dijangka apabila membandingkan lajur JSON. Artikel ini akan membimbing anda untuk membandingkan lajur JSON dengan berkesan dalam ujian aplikasi Laravel anda.
Apabila data JSON disimpan dalam pangkalan data, ia disimpan sebagai rentetan. Perbezaan kecil dalam pengekodan JSON, seperti jarak atau susunan kekunci, boleh menyebabkan perbandingan rentetan langsung gagal. Ini bermakna walaupun kandungan secara logiknya setara, ujian menggunakan $this->assertDatabaseHas() mungkin gagal.
Mula-mula, pertimbangkan model PriceSchedule, yang termasuk lajur JSON:
final class PriceSchedule extends Model { protected $fillable = [ 'user_id', 'price_supplier_id', 'weekday', 'hour', 'is_active' ]; protected $casts = [ 'weekday' => 'array', 'hour' => 'array', ]; }
Atribut hari bekerja dan jam dihantar ke tatasusunan, membolehkan manipulasi mudah dalam aplikasi anda.
Berikut ialah contoh ujian untuk mengemas kini Jadual Harga:
final class PriceExportScheduleTest extends TestCase { public function test_price_export_schedule_update(): void { $user = UserFactory::new()->create(); $this->actingAsFrontendUser($user); $priceSchedule = PriceScheduleFactory::new()->make(); $updatedData = [ 'weekday' => $this->faker->randomElements(DayOfWeek::values(), 3), 'hour' => $priceSchedule->hour, 'is_active' => true, ]; $response = $this->putJson(route('api-v2:price-export.suppliers.schedules.update'), $updatedData); $response->assertNoContent(); $this->assertDatabaseHas(PriceSchedule::class, [ 'user_id' => $user->id, 'is_active' => $updatedData['is_active'], 'weekday' => $updatedData['weekday'], 'hour' => $updatedData['hour'], ]); } }
Apabila menggunakan $this->assertDatabaseHas() untuk membandingkan nilai jenis JSON seperti hari bekerja dan jam, perbandingan langsung mungkin gagal disebabkan oleh perbezaan dalam pengekodan JSON. Contohnya:
Walaupun data secara logiknya sama, ujian mungkin gagal kerana rentetannya berbeza.
Untuk memastikan perbandingan yang konsisten, gunakan $this->castAsJson() apabila menegaskan lajur JSON:
$this->assertDatabaseHas(PriceSchedule::class, [ 'user_id' => $user->id, 'is_active' => $updatedData['is_active'], 'weekday' => $this->castAsJson($updatedData['weekday']), 'hour' => $this->castAsJson($updatedData['hour']), ]);
Kaedah ini memastikan kedua-dua data ujian dan data pangkalan data dihantar ke format JSON biasa sebelum perbandingan.
Menjalankan ujian menghasilkan keputusan berikut:
Price Export Schedule (PriceExportSchedule) ✔ Price export schedule update OK (1 test, 3 assertions)
Dengan menggunakan $this->castAsJson(), anda boleh mengelakkan isu pengekodan JSON dan memastikan bahawa ujian anda boleh dipercayai dan
tepat.
Atas ialah kandungan terperinci Cara Menguji Lajur JSON yang Sama dalam Model Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!