Задать вопрос

Как мокать модель (queryset) в django?

Всем привет.

Использую стандартную библиотеку: django.test и unittest.mock, хочу проверить следующий момент:

class Dynamical_Pages(TestCase):
    def test_advertisement(self):
        response = self.client.get('/advertisement')
        self.assertEqual(response.status_code, 200)


Т.е. проверяю - работает ли эта страница или нет.

При попытке запуска получаю ошибку по типу:

File "C:\python35\lib\site-packages\django\db\models\query.py", line 387, in get
    self.model._meta.object_name
faceset.models.DoesNotExist: Banner matching query does not exist.


Т.е. ругается, что нет данных от модели Banner.

Подскажите, пожалуйста, как можно модель мокнуть? Чтобы тест перестал на него ругаться?

Модель Banner

class Banner(models.Model):
    bancode = models.TextField()
    banlink = models.TextField()
    banimg = models.ImageField()

________________________________

Как подсказали ребята, попробовал factory-boy:

from django.test import TestCase
from django.test import Client
import factory
from faceset.models import Banner

#factory_boy data

class BannerFactory(factory.Factory):
    class Meta:
        model = Banner

    bancode = 'test_code_for_deploy'
    banlink = 'test_link_for_deploy'
    banimg = ''

class Dynamic_pages(TestCase):

    def test_upmenu(self):
        Banner = BannerFactory.create()
        response = self.client.get('/upmenu')
        self.assertEqual(response.status_code, 200)


Такая же ошибка появляется, я как-то его не так использую? Если передать данные в Banner.objects.create(...), то пашет. Как факториала использовать?
  • Вопрос задан
  • 890 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
un1t
@un1t
Надо перед выполнением get запроса в тесте создать тестовые объекты.

def test_advertisement(self):
        Banner.objects.create()
        response = self.client.get('/advertisement')
        self.assertEqual(response.status_code, 200)


Лучше сразу взять для этого factory-boy.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@FireGM
Для тестов нужна отдельная тестовая бд.
https://docs.djangoproject.com/en/1.10/topics/test...
https://docs.djangoproject.com/en/1.10/topics/test...
Ответ написан
Комментировать
@Bilyalov
Программист
Добавь записи в бд из метода setUp вручную. Нет данных потому , что база используется другая, тестовая
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы