Rumah > pembangunan bahagian belakang > tutorial php > Cara Menguji Lajur JSON yang Sama dalam Model Laravel

Cara Menguji Lajur JSON yang Sama dalam Model Laravel

Susan Sarandon
Lepaskan: 2025-01-04 17:05:47
asal
826 orang telah melayarinya

How to Test for Equal JSON Columns in Laravel Models

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.

Memahami Cabaran

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.

Contoh Model

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',
    ];
}
Salin selepas log masuk

Atribut hari bekerja dan jam dihantar ke tatasusunan, membolehkan manipulasi mudah dalam aplikasi anda.

Menulis Ujian

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'],
        ]);
    }
}
Salin selepas log masuk

Isu Biasa dengan Perbandingan JSON

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:

  • JSON yang disimpan pangkalan data: {"key":"value"}
  • JSON yang dijana PHP: { "kunci": "nilai" }

Walaupun data secara logiknya sama, ujian mungkin gagal kerana rentetannya berbeza.

Penyelesaian: Gunakan $this->castAsJson()

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']),
]);
Salin selepas log masuk

Kaedah ini memastikan kedua-dua data ujian dan data pangkalan data dihantar ke format JSON biasa sebelum perbandingan.

Keluaran Ujian

Menjalankan ujian menghasilkan keputusan berikut:

Price Export Schedule (PriceExportSchedule)
✔ Price export schedule update
OK (1 test, 3 assertions)
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan