Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 11.02.2020
Сообщений: 24

Тестирование views и models

27.07.2020, 12:16. Показов 830. Ответов 0

Студворк — интернет-сервис помощи студентам
Недавно начал изучать джанго, вроде все окей но когда дело доходит до тестов то у меня появляются вопросы насчет того что я не так сделал, в каком-то коде или не правильно начал делать. P.S. Будет много кодов, но все равно надеюсь на вашу помощь
views.py
[
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.shortcuts import render
from .forms import QueryForm
from .services.handler import gadget_handler, ProductNotFound
 
 
def detail(request):
    if request.method == "POST":
        form = QueryForm(request.POST)
        if form.is_valid():
            try:
                query_name = form.cleaned_data['query_name']
                result = gadget_handler(query_name)
                context = {'result': result}
                return render(request, 'polls/detail.html', context)
            except ProductNotFound:
                errors = "По запросу " + form.cleaned_data['query_name'] + " ничего не найдено"
                return render(request, 'polls/detail.html', {'errors': errors})
        else:
            errors = form.errors
            return render(request, 'polls/detail.html', {'errors': errors})
 
    return render(request, 'polls/detail.html')
тест на неё
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from django.test import TestCase, Client
from django.urls import reverse
from unittest.mock import patch
from ..exceptions import ProductNotFound
 
 
class TestViews(TestCase):
 
    def test_detail_GET(self):  # проверка шаблона
        client = Client()
        response = client.get(reverse('detail'))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'polls/detail.html')
 
    @patch('polls.views.gadget_handler')
    def test_result_POST(self, mock_gadget_handler):  # если есть продукт
        mock_gadget_handler.return_value = [{
            'title': 'Мобильный Телефон Xiaomi Redmi Note 9 PRO (6+128Gb) Global EU',
            'price': 17100,
            'url': 'http://www.gadget.kg/catalog/telefony/xiaomi/3400'}]
        client = Client()
        response = client.post(reverse('detail'), {'query_name': 'xiaomi redmi note 9'})
        self.assertEqual(response.context['result'], mock_gadget_handler.return_value)
 
    @patch('polls.views.gadget_handler')
    def test_products_not_found(self, mock_gadget_handler):
        mock_gadget_handler.side_effect = ProductNotFound('Товар не найден')
        client = Client()
        response = client.post(reverse('detail'), {'query_name': 'Arhat'}) # как мне продолжить что-бы проверить его
код моих моделек
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.db import models
# Create your models here.
 
 
class Query(models.Model):
    query_name = models.CharField(max_length=100)
    datetime = models.DateTimeField(auto_now=True, editable=True)
 
    def __str__(self):
        return self.query_name
 
 
class Result(models.Model):
    title = models.CharField(max_length=255)
    cost = models.IntegerField()
    url = models.URLField(max_length=255)
    query = models.ForeignKey(Query, on_delete=models.CASCADE)
 
    def __str__(self):
        return self.title
тест на него
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.test import TestCase
from django.utils import timezone
from ..models import Query, Result
 
 
class TestQuery(TestCase):
 
    def test_query_creation(self):
        q = Query.objects.create(query_name='xiaomi redmi note 9', datetime=timezone.now())
        self.assertTrue(q.__str__(), q.query_name)
 
 
class TestResult(TestCase):
 
    def test_result_creation(self): # этот тест жалуется на модельки
        q = Query.objects.create(query_name='xiaomi redmi note 9')
        r = Result.objects.create(title='Мобильный Телефон Xiaomi Redmi Note 9 PRO (6+128Gb) Global EU',
                                  cost=17100,
                                  url='http://www.gadget.kg/catalog/telefony/xiaomi/3400',
                                  query=q)
        self.assertEqual(r.__str__(), r.title)
ошибка на этот тест такой: File "/home/rahat/PycharmProjects/untitled1/venv/lib/python3.6/site-packages/django/apps/registry.py", line 229, in register_model
(model_name, app_label, app_models[model_name], model))
RuntimeError: Conflicting 'query' models in application 'appp': <class 'polls.models.Query'> and <class 'products-aggregator.mysite.polls.models.Query'>.


На всякий случай вот код handler.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from django.core.exceptions import ObjectDoesNotExist
from django.utils.timezone import utc
import datetime
 
from ..exceptions import ProductNotFound
from ..models import Query, Result
from .extractor import GadgetExtractor
from .transform import GadgetTransform
from .load_ver import GadgetLoader
import logging
 
logger = logging.getLogger('__name__')
 
 
def get_data_from_site(query_name):
    query_name = query_name.split()
    extractor = GadgetExtractor()
    link = extractor.get_product_link(name_list=query_name)
    page = extractor.get_html(url=link)
 
    transform = GadgetTransform()
    products = transform.get_data(html=page)
    return products
 
 
def load_date_into_database(products, query):
    loader = GadgetLoader()
    result = loader.load(products, query)
    return result
 
 
def gadget_handler(query_name):
    try:
        query_name = query_name.lower()
        query = Query.objects.get(query_name=query_name)
        now = datetime.datetime.utcnow().replace(tzinfo=utc)
        timediff = now - query.datetime
 
        if timediff.days > 1:
            logger.info('Update datetime')
            Query.objects.filter(query_name=query_name).update(datetime=now)
            logger.info("Query datetime updated")
 
            logger.info('Get data from site')
            result = get_data_from_site(query_name)
 
            logger.info('Delete data')
            Result.objects.filter(query_name=query_name).delete()
            logger.info('load data is deleted')
 
            logger.info('Insert new data')
            result = load_date_into_database(products=result, query=query)
            return result
 
        else:
            logger.info('GET data from database')
            result = Result.objects.filter(query=query)
            return result
 
    except ObjectDoesNotExist:
        logger.info('Creating new query and get new data from site')
        result = get_data_from_site(query_name)
        if result == 'Товар не найден':
            raise ProductNotFound('Товар не найден')
        else:
            query = Query.objects.create(query_name=query_name)
            res = load_date_into_database(products=result, query=query)
            return res
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.07.2020, 12:16
Ответы с готовыми решениями:

Во views не активизируется поле models при импорте
Коллеги подскажите в чем может быть проблема, первый раз с таким встретился. При импорте моделей из models не подсвечивается...

django.db.models Q
Подскажите пожалуйста у меня есть меня есть две таблицы: Рекламная конструкция с полями: имя, внешний ключ(город) ...

Django Models
Подскажите, пожалуйста, как в django models реализовать следующее: допустим у нас есть таблица домов и квартир. Каждый дом может иметь...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2020, 12:16
Помогаю со студенческими работами здесь

Models association
Нужно сделать на CakePHP! Помогите правильно связать таблицы так, чтобы для определенной книги выводились все читатели. Я пока не...

No module named models
импортировал как надо, но все равно ругается, я новичок в django, подскажите добрые люди в чем может быть проблема. Environment: ...

Advanced Linear/Nonlinear Models
Доброе время суток! Подскажите, пожалуйста, что мне нужно делать, чтобы отобразились команды подменю Statistics -&gt; Advanced...

Class 'Models\User' not found
Начал использовать пространства имен, и почему-то не видит класс bool(true) Fatal error: Class 'Models\User' not found in...

Django_filters! how to select models with `in` statement?
my filter: class CatsFilter(django_filters.FilterSet): class Meta: model = Cats fields = {'name': } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru