0

この質問を読んで時間を無駄にしないでください。以下に回答しました。

私のsettings.pyには次のものが含まれています。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'foo.db',
        'TEST_NAME': 'thetest.db'
    }
}

テストコードには次の行があります。

allShoes = models.Shoe.objects.filter()

テーブルにはviews.pyが入力されているため、allShoesにはオブジェクトが含まれている必要がありますが、コードでは空です。また、テストコードにset_trace()を挿入して一時停止し、sqlite3プログラムを使用して、foo.dbにtest.dbではなくオブジェクトが含まれていることを確認しました。

モデルクラスShoeをdjango.test.TestCaseとdjango.test.TransactionTestCaseから交互に派生させてみました。どちらも機能しませんでした。

私が使用しているもの:

>>> django.VERSION
(1, 4, 3, 'final', 0)

(venv)bmac:ol b$ python
Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin

私が間違っていることについて何か考えがありますか?

編集:明確にするために、foo.dbは空であり、テストが実行されてtest.dbが存在しない前に、syncdbによって事前に作成されています。私のテストはSeleniumテストで、ビュー(テスト対象のコードの一部)が呼び出され、ページを2回クリックします。クリックするたびに、別のビューを呼び出すAJAXハンドラーがあります。そのビュー(テスト中のより多くのコード)は、DBにエントリを作成します。したがって、最後に、DBがテストランナーによって破棄される前に、DBを2回クリックする必要があります。

編集:動作に違いは見られませんでしたが、問題を簡単にするためにDATABASESからTEST_NAMEを削除しました。テストの実行中に、ビューコードから次のコマンドを実行できます。

models.Shoe.objects.using('default').all()

オブジェクトを参照してください。ただし、私のテストルーチンから、同じステートメントで空のリストが生成されます。

4

2 に答える 2

1

Djangoテストランナーが実行されるとき、本番データベースは変更されません。私たちの質問でfoo.dbは、本番データベースとDjangoは、単体テストを実行するときにこれに触れないようにしていますか?代わりに、テストを実行するためだけに新しいデータベースが作成されます。通常、これはsqliteのインメモリデータベースになりますが、で指定TEST_NAMEしたsettings.pyため、テストデータベースは。という名前のディスク上のデータベースになりますthetest.db

テスト中にビューコードを呼び出してテスト中にレコードを入力しない限り、には何もありませんthetest.db

テストケースは次のようになります。

from django.test import TestCase

class MyTest(TestCase):

    def test_something(self):
        # Simulate a browser POST which would populate an object in Shoes.
        # When the test starts, the db is empty.
        response = self.client.post('/shoe/add/', {
            # Post data here.
        })

        self.assertEqual(
            1,
            models.Shoe.objects.count())
于 2013-02-26T03:51:53.103 に答える
0

私はまだこの解決策を確認していませんが、人々がこの質問を読むことに時間を費やしてほしくないです。接続の不安定さをシミュレートできるように、テストコードからDjango開発サーバーを実行していたために問題が発生したと思います。これにより、本番データベースが使用され、テストデータベースが空である理由が説明されました。ドー。

于 2013-02-26T17:47:33.670 に答える