在Django中,patch()
函数是测试框架unittest.mock
中的一个函数,它用于在测试过程中替换掉原有函数,并用一个新的函数来代替,在测试中验证新函数的行为是否正确。
patch()
函数的常用参数主要有以下几个:
target
:需要替换的函数名或对象;new
:替换原函数的新函数;autospec
:自动检查新函数的规范;side_effect
:新函数的副作用;return_value
:新函数的返回值。下面的代码段展示了如何使用patch()
函数:
from unittest.mock import patch
with patch('module.function') as mock_func:
mock_func.return_value = 'Test Value'
result = module.function()
这个使用方法的具体流程如下:
with
语句之前,原函数module.function
将被patch
所指定的mock对象替换掉;with
语句块中,对mock_func
的返回值进行赋值(即模拟原函数的行为);with
语句块结束之后,mock对象将被自动清除,并还原原函数。有一个Django的视图函数,需要调用外部的API接口。在测试过程中,为了避免每次测试都要去真正调用外部API,可以通过patch
函数来模拟外部API接口的调用:
class TestAPI(TestCase):
@patch('views.requests.get')
def test_api_response(self, mock_get):
mock_get.return_value.ok = True
mock_get.return_value.text = 'ok'
response = self.client.get('/api/')
self.assertEqual(response.status_code, 200)
在测试过程中,requests.get()
函数被mock对象所取代,使得不必调用真正的外部API接口,而是返回mock对象中指定的数据。
有一个Django的视图函数,需要发送邮件,但是邮件通常在测试时不应该被真实的发送出去。为了避免向真实邮箱发送邮件,可以在测试过程中通过patch()
函数来mock掉send_mail()
函数:
from django.core.mail import send_mail
class TestSendMail(TestCase):
@patch('views.send_mail')
def test_sendmail(self, mock_sendmail):
mock_sendmail.return_value = True
response = self.client.post('/send_email/')
self.assertEqual(response.status_code, 200)
在测试过程中,send_mail()
函数被mock对象所取代,使得不必实际发送邮件。
本文链接:http://task.lmcjl.com/news/16141.html