0

フィクスチャのデータでテストを実行しようとしていて、悪名高いIntegrityError: column user_id is not uniqueエラーが発生しています。Djangoテスト:(エ​​ラーの原因を診断することによって)唯一のフィクスチャデータとIntegrityErrorsを持たないデータベースを取得する方法は?

今、自分のフィクスチャを見てみると、私のフィクスチャの私のユーザモデルのIDはお互いにユニークであることがわかります。私は、衝突が(テストではない)データベースの既存のデータであると推測します。これは正しいです? (編集:これは間違っているようです - 下記を参照してください)

私のテストでは、どのデータが利用可能かを正確に制御できるようにしたいと考えています。 djangoテストランナーがライブデータベースからデータを読み込むのを防ぐ方法はありますか? (編集:はい - Thibautの答えを参照してください)。

編集: Thibautの回答に従ってメモリデータベースをクリーンに変更しても問題は解決されません。したがって、私は私の既存のdevデータベースが問題ではないと推測します。

私は3番目の質問があります。テスト中にフィクスチャをロードするときにIntegrityErrorの原因を診断するにはどうすればよいですか?(そして、私はそれをどのように修正すればよい?)

編集2:私の問題の解決策、(ティボーJあたり)クリーンデータベースで始まるに加えて、ユーザーを参照するインストール済みのアプリケーションからモデルを排除することでもありましたエラーが発生しなくなるまで繰り返す。

DrTyrsaの他の提案(データを見るより)はnatural keysを使用していましたが、ユーザーには疑いなく一定量のサルパッチやその他のハッカーが必要です(ユーザーのコードを編集してください)。

+1

それはあなたの 'User'モデルの問題ではない、それはUser''へ 'ForeignKey'を使用して、いくつかの他のモデルの問題です。 – DrTyrsa

+0

@DrTyrsa:あなたが正しいと思う(私のアップデートを一瞬で見てください)。これを診断/修正する方法を拡張してもよろしいですか? – Marcin

+1

あなたの什器やモデルを見なくても答えるのは難しいです。確かに問題を解決するのは、[自然キー](https://docs.djangoproject.com/en/dev/topics/serialization/#natural-keys)です。しかし、それを実装するには時間がかかるでしょう。もう一つのオプションは、 'setUp'メソッドで多くの関係を持つオブジェクトを作成することですが、たくさんある場合はあまり役に立ちません。あるいは、灯具を慎重に調べて、エラーの原因を突き止めることができます。 – DrTyrsa

答えて

0

prodとテスト(良い方法)のために別のデータベースを使用してください。 settings.pyで:

if 'test' in sys.argv:               
    try:                   
     from test_settings import *            
    except ImportError:               
     pass 

test_settings.pyで:

DATABASES = {                 
    'default': {                 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': 'memory://testdb', 
    }                   
} 
+0

ありがとうございます - これは私の問題を解決していませんが( 'エイリアス 'デフォルト'( ':メモリ:')...)のテストデータベースを作成しています。 (おとめ座のために、あなたの最初のスニペットはsettings.pyの最後に置かなければならないと付け加えるべきです)。 – Marcin

関連する問題