Есть ли способ переопределить методы модели в Django? - PullRequest
1 голос
/ 20 марта 2019

У меня есть такая модель:

class Car(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    create_date = models.DateTimeField('date added', auto_now_add=True)
    modify_date = models.DateTimeField('date modified', auto_now=True)
    ...

    def last_tracked_location(self):
        ...
        try:
            url = 'myurl'
            return requests.get(
                url,
            ).json()['location'])
        except:
            return False

Этот метод get вызывается позже для панели администратора.Он запрашивает что-то из API, а затем возвращает либо this, либо false.

В режиме тестирования другой API не существует, поэтому запрос задерживает все тесты до истечения времени ожидания, а затем возвращает False.

Есть ли способ переопределить это?Я проверил docs , но смог найти только переопределение настроек.

Еще одна идея, которая у меня возникла, заключалась в том, чтобы проверить внутри метода, вызывается ли он в режиме тестирования, а затем просто никогда не входить в этот блок try.Но я не думаю, что это чистый способ.

ОБНОВЛЕНИЕ

Я называю тесты так:

python3 manage.py test --settings=app.settings_test

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Проверка DEBUG напрямую в методе, на мой взгляд, не совсем чистая. Может быть, вам лучше написать какой-нибудь класс API для выполнения этого запроса?

Тогда вы можете либо написать отдельную логику для этого класса для запуска в «режиме тестирования» (не уверен, что я правильно понимаю, что вы подразумеваете под этим :) test env?), Либо просто создать макет в тестах.

Здесь вы можете узнать больше о сценариях условного тестирования: https://realpython.com/testing-third-party-apis-with-mocks/

1 голос
/ 20 марта 2019

Вы можете написать свои тесты так, чтобы они высмеивали ответ API. Модуль unittest mock является хорошей отправной точкой и частью стандартной библиотеки Python начиная с Python 3.3.

У меня нет доступа к вашему полному коду, но вот пример для начала:

from unittest import mock
from django.test import TestCase
from .models import Car


@mock.patch('yourapp.models.Car.last_tracked_location')
class CarTestCase(TestCase):
    def test_get_last_tracked_location(self, mock_last_tracked_location):
        mock_last_tracked_location.return_value = {'location': 'Paris'}
        car = Car.objects.create()
        response = car.last_tracked_location()
        assert response['location'] == 'Paris'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...