Джанго Нос не создает модели только для испытаний во время тестовых прогонов

У меня установлен django-nose 1.0 в качестве тестового прогона для проекта Django 1.3.1. Я следую инструкциям на странице pypi относительно моделей только для тестирования.

Вот мой config.py testrunner config:

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

Я провел тесты в течение нескольких месяцев, используя этот тестраннер без проблем. Сейчас я пытаюсь протестировать абстрактный класс и использую модель только для тестирования, но конкретный тест, который я написал, выдает ошибку.

Согласно документации, мне нужно только включить тестовый класс в один из файлов, который импортируется во время тестирования. У меня есть тесты, которые находятся в папке "тесты" и разбиты на несколько небольших файлов тестирования. Вот мои тесты /model_tests.py (модели и приложения специально переименованы по соображениям работы):

from django.tests import TestCase
from myapp.models import AbstractFoo

class Foo(AbstractFoo):
    pass


class TestFoo(TestCase):
    def setUp(self):
        self.foo = Foo.objects.create(name="Tester", 
                                      description="This is a test", ...)
    ... [tests follow]

Я получаю сообщение об ошибке в первой строке setUp:

DatabaseError: relation "tests_foo" does not exist
LINE 1: INSERT INTO "tests_foo" ("name", "description", "display...

И если я поставлю точку останова в тесте и проверим базу данных, таблица 'tests_foo' (или любая таблица с 'foo' в имени) не существует.

Есть идеи о том, почему не загружается тестовая модель?

2 ответа

Да, кажется, что это все еще проблема. Видел это с Джанго ==1.6 и Джанго-Нос ==1.3

Один из обходных путей - поместить все модели в __init__.py в вашем tests/ папка

Актуальная проблема на GitHub: django-nose / Issues / 77

Вам нужно создать модель в тестовой базе данных, для этого вам нужно сгенерировать миграцию или создать таблицу в базе данных вручную. Вы можете проверить мою реализацию второго варианта https://github.com/erm0l0v/django-fake-model

Этот код должен работать так, как вы ожидаете:

from django.tests import TestCase
from myapp.models import AbstractFoo

from django_fake_model import models as f


class Foo(f.FakeModel, AbstractFoo):
    pass


@Foo.fake_me
class TestFoo(TestCase):
    def setUp(self):
        self.foo = Foo.objects.create(name="Tester", 
                                      description="This is a test", ...)
    ... [tests follow]
Другие вопросы по тегам