我有这样的模型:
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
您可以编写测试,以便模拟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'
在我看来,直接在方法中检查DEBUG并不是很干净。也许你为写这个请求写一些API类会更好吗?
然后你可以为这个类编写单独的逻辑以在'测试模式'下运行(不确定我正确理解你是什么意思:)测试环境?)或者只是在测试中创建模拟。
在这里,您可以阅读有关有条件测试场景的更多信息:https://realpython.com/testing-third-party-apis-with-mocks/