有没有办法在django中覆盖模型方法?

问题描述 投票:1回答:2

我有这样的模型:

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

稍后为管理员面板调用此方法。它从api请求某些内容然后返回this或false。

在测试模式下,其他api不存在,因此请求会延迟所有测试,直到超时,然后返回False

有没有办法覆盖这个?我检查了docs,但只能找到覆盖设置。

我的另一个想法是在方法内部进行测试,如果它在测试模式中被调用,那么就永远不会进入这个try块。但我不认为这是一种干净的方式。

UPDATE

我这样称呼测试:

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

django django-models django-testing
2个回答
1
投票

您可以编写测试,以便模拟API的响应。自Python 3.3以来,unittest mock模块是一个很好的起点,也是Python标准库的一部分。

我无权访问您的完整代码,但这是一个让您入门的示例:

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'

2
投票

在我看来,直接在方法中检查DEBUG并不是很干净。也许你为写这个请求写一些API类会更好吗?

然后你可以为这个类编写单独的逻辑以在'测试模式'下运行(不确定我正确理解你是什么意思:)测试环境?)或者只是在测试中创建模拟。

在这里,您可以阅读有关有条件测试场景的更多信息:https://realpython.com/testing-third-party-apis-with-mocks/

© www.soinside.com 2019 - 2024. All rights reserved.