環境
Laravel v9.5.1 (PHP v8.1.3)
状況
DBテストを書いていたら下記のエラー。
エラー文だけでググっても解決せず、少し苦労したので備忘録とする。
str_ends_with(): Argument #1 ($haystack) must be of type string, array given
複数のデータが入っているかを一気にテストしたかったため、
配列の配列を第2引数としていた。
直感的にこう書けるかなと思ったがだめっぽい。
$users = User::factory(2)->create();
$this->assertDatabaseHas('post_histories', [
'user_id' => $users[0]->id,
'hoge_type' => 'hoge',
], [
'user_id' => $users[1]->id,
'hoge_type' => 'hoge',
]);
解決法
DBテストではレコードごとにデータが入っているかをテストする。
$users = User::factory(2)->create();
$this->assertDatabaseHas('posts', [
'user_id' => $users[0]->id,
'title' => $params['title']
'content' => $params['content']
]);
$this->assertDatabaseHas('posts', [
'user_id' => $users[1]->id,
'title' => $params['title']
'content' => $params['content']
]);
assertDatabaseHas
の実装を見てみると、配列の配列を渡せない実装になっていた!
(array $data
の部分)
protected function assertDatabaseHas($table, array $data, $connection = null)
{
$this->assertThat(
$table, new HasInDatabase($this->getConnection($connection), $data)
);
return $this;
}
class HasInDatabase extends Constraint
{
...
public function matches($table)
{
return $this->database->table($table)->where($this->data)->count() > 0;
}
...
}
参考