Heim > Backend-Entwicklung > PHP-Tutorial > So testen Sie auf gleiche JSON-Spalten in Laravel-Modellen

So testen Sie auf gleiche JSON-Spalten in Laravel-Modellen

Susan Sarandon
Freigeben: 2025-01-04 17:05:47
Original
826 Leute haben es durchsucht

How to Test for Equal JSON Columns in Laravel Models

Das Testen der Gleichheit zwischen JSON-Spalten in Laravel erfordert besondere Überlegungen, da JSON-Daten als Zeichenfolgen in der Datenbank gespeichert werden. Unterschiede in der JSON-Codierung können beim Vergleich von JSON-Spalten zu unerwarteten Testfehlern führen. Dieser Artikel führt Sie durch den effektiven Vergleich von JSON-Spalten in den Tests Ihrer Laravel-Anwendung.

Die Herausforderung verstehen

Wenn JSON-Daten in der Datenbank gespeichert werden, werden sie als Zeichenfolge gespeichert. Kleinere Unterschiede in der JSON-Codierung, wie z. B. Abstand oder Reihenfolge der Schlüssel, können dazu führen, dass direkte String-Vergleiche fehlschlagen. Das bedeutet, dass Tests mit $this->assertDatabaseHas() möglicherweise fehlschlagen, selbst wenn der Inhalt logisch gleichwertig ist.

Beispielmodell

Betrachten Sie zunächst das PriceSchedule-Modell, das JSON-Spalten enthält:

final class PriceSchedule extends Model
{
    protected $fillable = [
        'user_id',
        'price_supplier_id',
        'weekday',
        'hour',
        'is_active'
    ];

    protected $casts = [
        'weekday' => 'array',
        'hour' => 'array',
    ];
}
Nach dem Login kopieren

Die Wochentags- und Stundenattribute werden in Arrays umgewandelt, was eine einfache Bearbeitung in Ihrer Anwendung ermöglicht.

Den Test schreiben

Hier ist ein Beispieltest zum Aktualisieren eines PriceSchedule:

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'],
        ]);
    }
}
Nach dem Login kopieren

Häufiges Problem bei JSON-Vergleichen

Wenn Sie $this->assertDatabaseHas() verwenden, um Werte vom Typ JSON wie Wochentag und Stunde zu vergleichen, können direkte Vergleiche aufgrund von Unterschieden in der JSON-Codierung fehlschlagen. Zum Beispiel:

  • In der Datenbank gespeichertes JSON: {"key":"value"}
  • PHP-generiertes JSON: { „Schlüssel“: „Wert“ }

Auch wenn die Daten logisch identisch sind, kann der Test fehlschlagen, weil die Zeichenfolgen unterschiedlich sind.

Lösung: Verwenden Sie $this->castAsJson()

Um konsistente Vergleiche zu gewährleisten, verwenden Sie $this->castAsJson() beim Assertieren von JSON-Spalten:

$this->assertDatabaseHas(PriceSchedule::class, [
    'user_id' => $user->id,
    'is_active' => $updatedData['is_active'],
    'weekday' => $this->castAsJson($updatedData['weekday']),
    'hour' => $this->castAsJson($updatedData['hour']),
]);
Nach dem Login kopieren

Diese Methode stellt sicher, dass sowohl die Testdaten als auch die Datenbankdaten vor dem Vergleich in ein gemeinsames JSON-Format umgewandelt werden.

Testausgabe

Das Ausführen des Tests führt zu folgendem Ergebnis:

Price Export Schedule (PriceExportSchedule)
✔ Price export schedule update
OK (1 test, 3 assertions)
Nach dem Login kopieren

Durch die Verwendung von $this->castAsJson() können Sie JSON-Kodierungsprobleme vermeiden und sicherstellen, dass Ihre Tests sowohl zuverlässig als auch
sind genau.

Das obige ist der detaillierte Inhalt vonSo testen Sie auf gleiche JSON-Spalten in Laravel-Modellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage