0

ジャンゴ バージョン 1.3。

私は Django 単体テストが初めてです。最初のテストを作成しましたが、ログインが機能していないために失敗します。authこの理由は、フィクスチャによって提供されるはずのユーザー アカウントがデータベースに含まれていないためだと確信しています。

私が書いたコードは次のとおりです。

from django.test import TestCase
from django.test.client import Client

class OrderCreateTest(TestCase):
    fixtures = ['auth']

    def setUp(self):
        self.client = Client()

    def testSelectProduct(self):
        self.assertTrue(self.client.login(user='chris', password='password'),
            'Unexpected login failure.')

        response = self.client.get('/order/new/')

        print response

        self.client.logout()

    def tearDown(self):
        pass

    def runTest(self):
        pass

私が得ているテストの失敗は次のとおりです。

Creating test database for alias 'default' ('test_proj')...
Creating tables ...
...
Running post-sync handlers for application admin
...
Installing custom SQL ...
Installing indexes ...
Installing index for admin.LogEntry model
...
Running post-sync handlers for application admin
...
Loading 'initial_data' fixtures...
Checking '/usr/local/lib/python2.7/dist-packages/django/contrib/admin/fixtures' for fixtures...
No xml fixture 'initial_data' in '/usr/local/lib/python2.7/dist-packages/django/contrib/admin/fixtures'.
...
Checking absolute path for fixtures...
No xml fixture 'initial_data' in absolute path.
No xml fixture 'initial_data' in absolute path.
No xml fixture 'initial_data' in absolute path.
No xml fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No xml fixture 'initial_data' in absolute path.
No xml fixture 'initial_data' in absolute path.
No xml fixture 'initial_data' in absolute path.
No xml fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No json fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No yaml fixture 'initial_data' in absolute path.
No fixtures found.
Destroying test database for alias 'default' ('test_proj')...
testSelectProduct (orpheus.orders.tests.ordercreate.OrderCreateTest) ... FAIL

======================================================================
FAIL: testSelectProduct (orpheus.orders.tests.ordercreate.OrderCreateTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/path/to/ordercreate.py", line 24, in testSelectProduct
    'Unexpected login failure.')
AssertionError: Unexpected login failure.

----------------------------------------------------------------------
Ran 1 test in 2376.829s

FAILED (failures=1)
Destroying test database for alias 'default' ('test_proj')...

データベースを使用した私の設定からのスニペット:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'project',
        'USER': 'project',
        'PASSWORD': 'projectdb',
        'TEST_NAME': 'test_project' } }

テスト コードを実行したところ、フィクスチャauthが検出され、検出されたデータがどこかに保存されていることがわかります。テストを中断して mysql にドロップし、関連するテーブルにクエリを実行しましたが、それらはすべて空のままです (テスト コードはトランザクションを処理するセクションをスキップしているため、コミットを待つ必要はないと確信しています)。

フィクスチャが正しくロードされない原因は何ですか?

編集:フィクスチャのロードをテストするという素晴らしいアイデアがあり、成功しました:

$ ./manage.py loaddata auth
Installed 8 object(s) from 1 fixture(s)

ただし、これはフィクスチャの読み込みを修正する方法についてのアイデアを私に与えません。

編集:スーパーバキュオは、私がこれを試すことを提案したときに手がかりを提供しました:

./manage.py testserver -v 2 auth.json 

出力は、フィクスチャを正しくロードすることを除いて、ほとんど同じです (mysql で確認済み)。

...
Installed 8 object(s) from 1 fixture(s)
Validating models...
0 errors found

Django version 1.3, using settings 'project.settings'
Running django-devserver 0.1.4

そこからどこへ行けばいいのかわからない。

4

2 に答える 2

1

問題は、見た目とはまったく異なりました。私のテストでは、次のように書きました。

    self.assertTrue(self.client.login(user='chris', password='password'),
        'Unexpected login failure.')

キーワード arg が代わりにusername. データベースにデータが欠落しているという赤いニシンをたどりました。これは、トランザクションによって説明されています。

助けてくれた #django の mlavin に感謝します。

于 2012-08-24T20:29:39.357 に答える
0

テストデータベースと関係があると思います(最初の本能が示唆したように)。Django の関連コードを見ると、loaddata内部で実行されているだけです。

# django/test/testcases.py
if hasattr(self, 'fixtures'):                                           
    # We have to use this slightly awkward syntax due to the fact   
    # that we're using *args and **kwargs together.                     
    call_command('loaddata', *self.fixtures,                            
                 **{'verbosity': 0, 'database': db}) 

したがって、loaddataテストの外で動作する場合 (明らかに動作するように)、問題は別の場所にあるはずです。で動作することを考えると./manage.py testserver、コードベースの何かが、フィクスチャが無視されるようにデータベース設定を検査および変更してsys.argvいると思われます。予期しない場所でプロジェクトを横断testできますか? 次のようなセクションがあります。greptestsettings.py

if 'test' in sys.argv:                              
    # Switch to sqlite for tests (it's *way* faster)                              
    DATABASE_ENGINE = 'sqlite3'                  
于 2012-08-23T22:43:00.213 に答える