LaravelでJSON型のカラムのvalueが配列である場合のテスト方法について

実現したいこと

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 コメント