2017-05-10 14 views
0

これまでのところ、SQLite上での開発とテストが行​​われていましたが、生産はPostgres上で行われていました。これでPostgresですべてを実行する必要があり、多数のテストが壊れました。理由は、各テストのIDが1で始まらず、テスト間で継続するからです。この問題を解決する方法PostgresでのDjangoテスト - リセットシーケンス

一つの方法はとても

class FooCase(APITransactionTestCase): 
    reset_sequences = True 

この作品で

class FooCase(APITestCase): 

を変え、TransactionTestCaseを使用することですが、私は試してみて、テストを修正することができますが、それは

遅くなります多くのテストではメソッドを嘲笑しているので、かなり難しいです。別の方法があります。シーケンスをリセットして、すばやく整理できるようにする方法はありますか?

+1

特にテストは1から始まるシーケンスに依存しますか? –

+1

あなたがスイッチを作ったことは良いことです!あなたのアプリケーションは、ギャップを持たないシーケンスに頼るべきではありません! – e4c5

+0

@DanielRosemanテストユーザーを作成するとき、私は彼らのpkを知っています。私はJSON '@ mock.patch'の中でそのpkを使います(JSONは読みやすくするために別のファイルにあります)。 –

答えて

1

は、SQLを使用してテストする前にシーケンスをリセットすることができます。

SELECT setval(sequence_name, 1), sequence_name FROM information_schema.sequences; 

しかし、次の点に注意してください

SELECT currval('my_sequence'); --Returns 1 
SELECT nextval('my_sequence'); --Returns 2 

だから、あなたのコードに直接nextvalを呼び出す場合、シーケンスではなく、2を返します。ポストグルのシーケンスは、表のようなものです。

SELECT last_value FROM my_sequence; --Returns 1 

しかし、このアプローチのバイパスcurrval ACIDの保護、同時実行安全ではないの意味。

+0

しかし、これはまったく_clean_ソリューションのようには見えません。最良の場合、ミックスインを作成してすべてのテストに追加する必要があります。しかし、それは動作する可能性があります –

+0

このコードをテストユーザーを作成するメソッドに追加することができます – e4c5

+0

あなたはそうです、それはきれいな解決策ではありません。しかし、私は "問題"は、ユニットテストでユーザIDを知る必要があると思います。テスト前にこのIDを検出することはできませんか? –