我正在尝试创建UserFactory
,运行./manage.py test
时出现此错误:
OperationalError: no such table: auth_user
这就是我的factories.py
文件:
import factory
import django.contrib.auth.models as auth_models
from wacep.weatherroulette.models import (
GameState, Puzzle
)
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = auth_models.User
username = factory.Sequence(lambda n: "user_%d" % n)
class PuzzleFactory(factory.django.DjangoModelFactory):
class Meta:
model = Puzzle
display_name = factory.Sequence(lambda n: 'Test Puzzle {0}'.format(n))
description = factory.Sequence(lambda n: 'Description {0}'.format(n))
class GameStateFactory(factory.django.DjangoModelFactory):
class Meta:
model = GameState
user = UserFactory()
current_inventory = 300
任何人都知道这里发生了什么?
答案 0 :(得分:2)
哦..继承factory.Factory
代替factory.django.DjangoModelFactory
似乎可以解决错误。
答案 1 :(得分:2)
实际上,错误发生是因为django.contrib.auth
不属于您的settings.INSTALLED_APPS
。
当factory_boy
尝试创建django.contrib.auth.models.User
并且未在数据库中找到相关表时,您会看到错误。
该表应该在测试开始时由Django的测试运行器自动创建;它未创建的事实意味着您未将django.contrib.auth
添加到INSTALLED_APPS
。
答案 2 :(得分:1)
我实际上遇到了这个问题,因为我自己也有同样的问题,经过一番研究后我想我知道问题是什么。你可能已经猜到了,这与这一行有关:
user = UserFactory()
在这里你实际做的是尝试在没有正确使用Django ORM的情况下创建User对象。作为旁注:我还没有完全解析这里出了什么问题 - 它是在设置测试数据库之前尝试在导入期间创建User对象,还是实际上没有与相应的数据库通信。结果至少是它需要一点Django魔法来创建你的对象。而factory_boy提供了魔力。
将此行更改为:
user = UserFactory.create()
应该修复你的错误。
答案 3 :(得分:0)
这真的是一个迟到的答案,但我今天遇到了这个问题,并希望分享我的解决方案。
使用django,我的开发设置settings.local
使用Postgresql,但测试设置settings.test
使用sqlite3。在settings.test
下运行测试会导致no such table
错误,如下所示。
$ DJANGO_SETTINGS_MODULE=myproject.settings.test python manage.py test
OperationalError: no such table: ...
这似乎是因为sqlite3数据库没有架构,因为我从未使用sqlite3进行开发。所以我migrate
用于sqlite
$ DJANGO_SETTINGS_MODULE=myproject.settings.test python manage.py migrate
# ... migration running for sqlite3 ...
迁移完成后,我可以按照预期使用sqlite3测试数据库运行测试。