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.
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.
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', ]; }
Die Wochentags- und Stundenattribute werden in Arrays umgewandelt, was eine einfache Bearbeitung in Ihrer Anwendung ermöglicht.
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'], ]); } }
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:
Auch wenn die Daten logisch identisch sind, kann der Test fehlschlagen, weil die Zeichenfolgen unterschiedlich sind.
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']), ]);
Diese Methode stellt sicher, dass sowohl die Testdaten als auch die Datenbankdaten vor dem Vergleich in ein gemeinsames JSON-Format umgewandelt werden.
Das Ausführen des Tests führt zu folgendem Ergebnis:
Price Export Schedule (PriceExportSchedule) ✔ Price export schedule update OK (1 test, 3 assertions)
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!