5

私は Django 1.5 を使用しており、カスタム ユーザー モデルでアプリケーションを動作させようとしています。どこでも使用できるようにアプリを変更しましたがget_user_model、アプリ自体には今のところ問題はありません。

問題は、アプリもテストできるようにしたいということですが、ForeignKeyカスタム ユーザー モデルを使用してモデル フィールドを正しくテストする方法が見つかりません。以下に添付されているテスト ケースを実行すると、次のエラーが発生します。

ValueError: Cannot assign "<NewCustomUser: alice@bob.net>": "ModelWithForeign.user" must be a "User" instance.

これは、テストに使用しているファイルです。

from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.tests.custom_user import CustomUser, CustomUserManager
from django.db import models
from django.test import TestCase
from django.test.utils import override_settings

class NewCustomUser(CustomUser):
    objects = CustomUserManager()
    class Meta:
        app_label = 'myapp'

class ModelWithForeign(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

@override_settings(
    AUTH_USER_MODEL = 'myapp.NewCustomUser'
)   
class MyTest(TestCase):
    user_info = {
        'email': 'alice@bob.net',
        'date_of_birth': '2013-03-12',
        'password': 'password1'
    }   

    def test_failing(self):
        u = get_user_model()(**self.user_info)
        m = ModelWithForeign(user=u)
        m.save()

ここForeignKeyで説明したように引数リストでユーザー モデルを参照していますが、設定変更が行われる前に属性が評価されるため、そこを使用しても何も変わりません。カスタム ユーザー モデルを使用しているときに、この ForeignKey をテストでうまく機能させる方法はありますか?get_user_modeluser

4

1 に答える 1

3

これについては Django メーリング リストでも質問しましたが、少なくとも現在のところ、 を変更してsettings.AUTH_USER_MODELとうまく動作させる方法はないようForeignKeyです。

これまでのところ、アプリをテストするために、この回答runtests.pyからファイルを作成しました:

import os, sys
from django.conf import settings

if len(sys.argv) >= 2:
    user_model = sys.argv[1]
else:
    user_model = 'auth.User'

settings.configure(
    ...
    AUTH_USER_MODEL=user_model,
    ...
)

...

そして、さまざまなユーザー モデルを使用して実際にテストを実行するための bash スクリプトを追加しました。

for i in "auth.User" "myapp.NewCustomUser"; do
    echo "Running with AUTH_USER_MODEL=$i"
    python runtests.py $i
    if [ $? -ne 0 ]; then
        break
    fi
done

最後のビットは、「静的」変数を使用する代わりに、関数を使用して実際に適切なユーザー モデル情報を取得することです。

def get_user_info():
    if settings.AUTH_USER_MODEL == 'auth.User':
        return {default user info}
    if settings.AUTH_USER_MODEL == 'myapp.NewCustomUser':
        return {my custom user info}
    raise NotImplementedError

これが問題の正しい答えであると主張しているわけではありませんが、これまでのところ...うまくいきます。

于 2013-03-28T05:51:56.957 に答える