ホームページ >バックエンド開発 >PHPチュートリアル >Laravel モデルで JSON 列が等しいかどうかをテストする方法

Laravel モデルで JSON 列が等しいかどうかをテストする方法

Susan Sarandon
Susan Sarandonオリジナル
2025-01-04 17:05:47848ブラウズ

How to Test for Equal JSON Columns in Laravel Models

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'],
        ]);
    }
}

JSON 比較に関する一般的な問題

$this->assertDatabaseHas() を使用して曜日や時間などの JSON タイプの値を比較する場合、JSON エンコードの違いにより直接比較が失敗する可能性があります。例:

  • データベースに保存された JSON: {"キー":"値"}
  • PHP で生成された JSON: { 「キー」:「値」 }

データが論理的に同一であっても、文字列が異なるためにテストが失敗する可能性があります。

解決策: $this->castAsJson() を使用します。

一貫した比較を保証するには、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。