Django Test работает с тестовым приложением manage.py, но не с тестом manage.py

Я написал TestCase для проверки моего представления, которому нужен объект-учитель.

class ShowTeacherViewTest(TestCase):
@classmethod
def setUpTestData(cls):
    gender = Gender.objects.create(gender='Male')
    gender_id = gender.id
    Teacher.objects.create(
            gender_id=gender_id,
            first_name='Maria',
            last_name='Santana',)

def test_view_uses_correct_template(self):
    teacher = Teacher.objects.first().id
    response = self.client.get(reverse('get_student'), {'teacher': teacher})
    self.assertEqual(response.status_code, 200)

Когда я запускаю тестовое приложение manage.py, все работает отлично.

Если я запускаю «manage.py test», эта ошибка исчезает:

 self.model._meta.object_name
 students.gender.Gender.DoesNotExist: Gender matching query does not exist.

Я использую эти объекты учителя и в других моделях-тестах из-за некоторых внешних ключей. Итак, возможно или необходимо сбрасывать test_db перед каждым тестом?

Вот полная трассировка:

Traceback (most recent call last):
  File "/Users/user/django/venv/teaching/tests/test_get_students.py", line 157, in test_view_uses_correct_template
    response = self.client.get(reverse('get_student'), {'student': student})
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/test/client.py", line 527, in get
    response = super().get(path, data=data, secure=secure, **extra)
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/test/client.py", line 339, in get
    **extra,
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/test/client.py", line 414, in generic
    return self.request(**r)
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/test/client.py", line 495, in request
    raise exc_value
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/user/django/venv/teaching/get_students.py", line 55, in get_student
    image = get_alibi_pic(image, gender, student)
  File "/Users/user/django/venv/teaching/get_students.py", line 27, in get_alibi_pic
    gender_male = Gender.objects.get(pk=1)
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/user/anaconda3/envs/venv/lib/python3.7/site-packages/django/db/models/query.py", line 399, in get
    self.model._meta.object_name
students.gender.Gender.DoesNotExist: Gender matching query does not exist.

Я обновил свой пост с полной трассировкой

Lukas Schönsgibl 09.04.2019 18:18

Что содержится в teaching/get_students.py? Там тест? Ошибка говорит о том, что проблема при запуске gender_male = Gender.objects.get(pk=1).

gdef_ 09.04.2019 18:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трассировка показывает, что эта строка не работает:

gender_male = Gender.objects.get(pk=1)

Обычно вы не должны жестко задавать первичные ключи в своем коде или тестах. Когда вы запускаете все тесты с помощью manage.py test, объект создается с другим первичным ключом, поэтому get(pk=1) терпит неудачу.

Если вам действительно нужно жестко закодировать pk в коде, вам нужно создать объект с правильным pk в тестовом классе:

gender = Gender.objects.create(pk=1, gender='Male')

Однако лучшим решением было бы изменить код так, чтобы он не использовал жестко заданный pk.

gender_male = Gender.objects.get(gender='Male')

Исправил мой код. Спасибо за ваш ответ и за то, что помогли улучшить мой код и мой тест.

Lukas Schönsgibl 10.04.2019 05:24

Другие вопросы по теме