実現したいこと
Laravelで、JSON型のカラムのvalueが配列である場合のテストをしたいです。
前提
- データベースはMySQL8系です。
- fooテーブルのbarカラムはJSON型です。
- barカラムは {"baz": [1, 2, 3]} のような値をとります。
Laravelのテストで、assertDatabaseHasを使ってfooテーブルのbarカラムのkeyが"baz"のvalueを検証したいです。
php
1// 前提として$expected = [1, 2, 3] になるような処理が実行される2 3$this->assertDatabaseHas('foo', [4 'bar->baz' => $expected,5]);
このようなコードを書いたところ、実際にbarカラムに {"baz": [1, 2, 3]} という値だったとしても何故かテストでは"[1, 2, 3]"という文字列として認識されるため、型が合わないためテストが失敗します。
対策として、期待値をjson_encodeで文字列にしてみました。
php
1$this->assertDatabaseHas('foo', [2 'bar->baz' => json_encode($expected),3]);
しかし今度は[1, 2, 3]が"[1,2,3]"のように半角スペースが除去された状態に変換されてしまい、データベース側が"[1, 2, 3]"、期待値が"[1,2,3]"でテストが失敗します。
質問したいこと
なぜデータベースには [1, 2, 3] のように配列形式で入っている値が、assertDatabaseHasの時に"[1, 2, 3]"という文字列として認識されてしまうのか。これを回避する方法はあるか。
よろしくお願いいたします。
0 コメント