ホームページ >バックエンド開発 >PHPチュートリアル >Laravel モデルで JSON 列が等しいかどうかをテストする方法
JSON データはデータベースに文字列として保存されるため、Laravel の JSON 列間の等価性をテストするには特別な考慮が必要です。 JSON のエンコード方法の違いにより、JSON 列を比較するときに予期しないテストの失敗が発生する可能性があります。この記事では、Laravel アプリケーションのテストで JSON 列を効果的に比較する方法を説明します。
JSON データがデータベースに保存される場合、文字列として保存されます。キーの間隔や順序など、JSON エンコードのわずかな違いにより、文字列の直接比較が失敗する可能性があります。これは、コンテンツが論理的に同等であっても、$this->assertDatabaseHas() を使用したテストは失敗する可能性があることを意味します。
まず、JSON 列を含む PriceSchedule モデルを検討します。
final class PriceSchedule extends Model { protected $fillable = [ 'user_id', 'price_supplier_id', 'weekday', 'hour', 'is_active' ]; protected $casts = [ 'weekday' => 'array', 'hour' => 'array', ]; }
曜日と時間の属性は配列にキャストされるため、アプリケーションで簡単に操作できます。
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'], ]); } }
$this->assertDatabaseHas() を使用して曜日や時間などの JSON タイプの値を比較する場合、JSON エンコードの違いにより直接比較が失敗する可能性があります。例:
データが論理的に同一であっても、文字列が異なるためにテストが失敗する可能性があります。
一貫した比較を保証するには、JSON 列をアサートするときに $this->castAsJson() を使用します。
$this->assertDatabaseHas(PriceSchedule::class, [ 'user_id' => $user->id, 'is_active' => $updatedData['is_active'], 'weekday' => $this->castAsJson($updatedData['weekday']), 'hour' => $this->castAsJson($updatedData['hour']), ]);
このメソッドにより、比較前にテスト データとデータベース データの両方が共通の JSON 形式にキャストされます。
テストを実行すると次の結果が生成されます:
Price Export Schedule (PriceExportSchedule) ✔ Price export schedule update OK (1 test, 3 assertions)
$this->castAsJson() を使用すると、JSON エンコードの問題を回避し、テストの信頼性と
の両方を保証できます。
正確です。
以上がLaravel モデルで JSON 列が等しいかどうかをテストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。