[Laravel] Testでデータ削除してるのに assertDatabaseMissing が Failed になる

2021/09/28

結論

削除しようとしているそのモデル、SoftDelete 設定になってません?

assertDatabaseMissing ではなく assertSoftDeleted 使ってね。

詳細

テストコードをたくさん書いていくぜー!

って張り切ったものの、めっちゃ足止め食らいました…。

リモートデバッグで1行ずつ動かしても、

App\Models\Post::count()
1

(ここで削除してるはず)

App\Models\Post::count()
0

(ちゃんと消えてるじゃん!)

なのに結果は…

Failed asserting that a row in the table [posts] does not match the attributes {
    "id": 4
}.

Found: [
    {
        "id": 4,
        "parent_id": 6,
        "title": "OnlrEfilJ2Igi9kpUZ91AvkKJJf6Rrg7wQtqhtLmS9wMXaAI1NMQh4JqrP684iPSRVAy6i7cM1m94T1w4YVyXYSuwrpmqVRdDEaT",
        "content": "COh8VWODN8gTUZopDDvLzVXx6uOtdgoVWwxtJKaFWyPH(略)0IRbztNQV0rP5jkDw6lRjQAwo7l4ShUAdlnY",
        "post_date": "2021-09-29 00:00:00",
        "created_at": "2021-09-29 11:26:42",
        "updated_at": "2021-09-29 11:27:25",
        "deleted_at": "2021-09-29 11:27:25"
    }
].

となりまして想定通りに行かず…。

DB の Driver が SQLite になっていて、外部参照キーがうんぬんカスケードが…みたいな話は見つかったものの、それじゃないんだよなー…と結構悩みました。

結局、 assertDatabaseMissing は soft_delete を考慮していない、ということに気づけていなかったのでした。

LaravelEloquent,Laravel,PHP

Posted by S