1

現在、既存のコードの単体テストを作成しています。次の問題に直面しました。

テスト データベースを作成するために syncdb を実行した後、Django は django_content_type や auth_permissions などのいくつかのテーブルを自動的に埋めます。

次に、ユーザー登録の確認などの複雑なテストを実行する必要があるとします。これには、多数のデータ テーブルとそれらの間の接続が必要です。

フィクスチャを作成するために既存のデータベース全体を使用しようとすると (それは私にとってかなり便利です)、hereのようなエラーが表示されます。これは、Django が django_content_type のようなテーブルを既に埋めているために発生します。

次に考えられる方法は、django dumpdata --exclude オプションを使用して、すでに syncdb テーブルでいっぱいになっていることです。しかし、これもうまく機能しません。なぜなら、syncdb によって自動的に作成されたデータベースとユーザー権限テーブルからユーザー オブジェクトとユーザー グループ オブジェクトを取得すると、それらを接続する主キーが間違っているため、エラーを受け取る可能性があるからです。これは、ここの「フィクスチャ地獄」の部分でよりよく説明されていますが、そこに示されている解決策は見栄えがよくありません)

次に考えられるスキームは次のとおりです。

  1. テストを実行しています。Django はテスト データベースを作成し、syncdb を作成して、それらすべてのテーブルを作成します。
  2. 私のテスト セットアップでは、このデータベースを削除して、新しい空のデータベースを作成しています。
  3. テスト セットアップでも既存のデータベースからデータ ダンプを読み込む
4

2 に答える 2

0

それが問題が解決された方法です:

syncdb がテスト データベースを作成した後、テストの setUp 部分でos.system、コードからシェルにアクセスするために使用します。次に、テストに使用したいデータベースのダンプをロードしています。

したがって、これは次のように機能します。syncdb は contenttype とその他のテーブルにデータを入力します。次に、テストのsetUp部分でSQLダンプをロードすると、以前に作成されたデータがすべてクリアされ、素敵なデータベースが得られます。

最善の解決策ではないかもしれませんが、うまくいきます =)

于 2010-03-26T17:33:19.627 に答える
0

私のアプローチは、最初に South を使用して DB の移行を簡単にし (これはまったく役に立ちませんが、良いことです)、次にモデル作成メソッドのモジュールを使用することです。

走るとき

  $  manage.py test my_proj

South がインストールされた Django でテスト DB を作成し、すべての移行を実行して、完全に更新されたテスト データベースを作成します。

テストを作成するには、まず Python モジュール コール test_model_factory.py を作成します。ここで、オブジェクトを作成する関数を作成します。

def mk_user():
   User.objects.create(...)

次に、テストで test_model_factory モジュールをインポートし、各テストのオブジェクトを作成できます。

  def test_something(self):
     test_user = test_model_factory.mk_user()

     self.assert(test_user ...)
于 2010-07-22T23:02:28.103 に答える