factory_boy UserFactory:没有这样的表:auth_user

时间:2014-10-07 20:15:41

标签: python django nose factory-boy

我正在尝试创建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

任何人都知道这里发生了什么?

4 个答案:

答案 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测试数据库运行测试。