コーヒー飲みながら仕事したい

仕事で使う技術的なことの備忘録とか


Wordpress に引っ越しました!

SQLite を使用して単体テストしていると、'FOREIGN KEY constraint failed' と怒られる

移転しました。

単体テストSQLite を使用していて困ったことが合ったので、その概要と解決策です。

外部キー制約にひっかかる

DB を使用する箇所の単体テストにおいて SQLite を使用することで簡単にテスト環境を構築することが出来ます。とりあえずテストしたいところだけをピンポイントでメモリ上にデータベースを作ることが出来るので、テスト環境をわざわざ用意する必要もないですし。

しかし、今回テスト実行時、context.SaveChanges() のタイミングで以下のような例外がでました。

SqliteException: SQLite Error 19: FOREIGN KEY constraint failed

どうやら外部キー制約にひっかかっているみたいです。

しかし、単体テストなのでわざわざ外部キー制約までしっかりしたメモリ上DBを用意するのはは面倒です。(というかそういう面倒なことを排除できることが魅力だし)

どうしたものかと調べてみると、安定の StackOverflow に回答がありましたので残しておきます。

外部キー制約を強制的に無効にする

どうやら SQLite でもデフォルトでは外部キー制約が有効になっているようです。
これを無効にする方法として↓でいろいろ議論されていますが、どうやら EF Core で SQLite を使用する場合の仕様のようです。

github.com

ということで、強引に無効にする方法として、以下のようにしました。

using (var context = CreateDbContext(options))
{
    // ↓ これ!!
    context.Database.ExecuteSqlCommand("PRAGMA FOREIGN_KEYS=OFF");

    // 疑似的にメモリ上にDBを生成する
    context.Database.EnsureCreated();

    // 何かしらのテスト処理
    ...
}

PRAGMA という名前からして本当はよろしくない感が半端ないですが、とりあえずこれで外部キー制約を無効にすることが出来ました・・・