在Django 1.5中使用自定义用户模型作为ForeignKey进行测试
我正在使用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
的参数列表中引用了用户模型,具体方法可以在 这里找到,但在这里使用 get_user_model
并没有改变任何事情,因为 user
属性在设置更改之前就已经被评估了。有没有办法让这个 ForeignKey 在我使用自定义用户模型时能够顺利进行测试呢?
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
我并不是说这是解决问题的正确答案,但到目前为止……它是有效的。