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 サイトの他の関連記事を参照してください。

この記事では、PHPでインターフェイスを作成、実装、および使用する方法について説明し、コード組織と保守性の利点に焦点を当てています。

この記事では、PHPのCrypt()とpassword_hash()の違いについて、パスワードハッシュの違いについて説明し、最新のWebアプリケーションの実装、セキュリティ、および適合性に焦点を当てています。

記事では、入力検証、出力エンコード、およびOWASP ESAPIやHTML浄化器などのツールを使用して、PHPのクロスサイトスクリプト(XSS)を防止します。

PHPでのオートローディングは、必要に応じてクラスファイルを自動的にロードし、メモリの使用を削減し、コード組織を強化することでパフォーマンスを向上させます。ベストプラクティスには、PSR-4の使用とコードを効果的に整理することが含まれます。

PHPストリームは、一貫したAPIを介したファイル、ネットワークソケット、圧縮形式などのリソースの処理を統合し、複雑さを抽象化し、コードの柔軟性と効率を高めます。

この記事では、PHPでファイルアップロードサイズの管理を管理し、2MBのデフォルト制限とPHP.ini設定を変更してそれを増やす方法に焦点を当てています。

この記事では、PHP 7.1で導入されたPHPのヌル可能なタイプについて説明し、変数またはパラメーターが指定されたタイプまたはnullのいずれかを可能にします。読みやすさの改善、タイプの安全性、明示的な意図などの利点を強調し、宣言する方法を説明します

この記事では、プログラミングのunset()とlink()関数の違いについて説明し、目的とユースケースに焦点を当てています。 unset()はメモリから変数を削除しますが、link()はファイルシステムからファイルを削除します。どちらもEFFECにとって重要です


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック









