[英]Mock instance method of a model class by replacing it with a new method
我想通過模擬在單元測試中用新函數替換實例方法“set_email_id”。 實例方法返回 email_id 字段,但我想要一個新函數來打印相同的字段。 我不確定要使用哪個模擬功能。 我讀過 side_effect、mock.object 等。我無法讓它工作。
腳本:
class Myclass(models.Model):
email_id = models.CharField(max_length=128, null=True, blank=True)
def return_email_id(self):
return self.email_id
def run():
my_class = Myclass()
my_class.email_id = 1
#want to moke this call
my_class.return_email_id()
單元測試:
@patch('models.Myclass.return_email_id')
def test(self, mock_email_id):
def new_method():
# this should replace the instance method
print(self.email_id)
# I know this wouldn't work. I just wanted to show it as an example
mock_email_id.side_effect = new_method()
參考這個例子。
mook_2.py
from datetime import datetime
import requests
from constants import STATUS_ENDPOINT
class BuildStatus:
"""The CI status of a pull request."""
@staticmethod
def build_date() -> str:
return datetime.utcnow().isoformat()
@classmethod
def notify(cls, merge_request_id, status):
build_status = {
"id": merge_request_id,
"status": status,
"built_at": cls.build_date(),
}
response = requests.post(STATUS_ENDPOINT, json=build_status)
response.raise_for_status()
return response
test_mook.py
from unittest import mock
from constants import STATUS_ENDPOINT
from mock_2 import BuildStatus
@mock.patch("mock_2.requests") # mock_2.requests를 호출하면 mock_requests 모의 객체가 대신할것
def test_build_notification_sent(mock_requests):
build_date = "2018-01-01T00:00:01"
with mock.patch("mock_2.BuildStatus.build_date", return_value=build_date): # build_date 호출시 설정한 날짜 반환하도록함,
BuildStatus.notify(123, "OK")
expected_payload = {"id": 123, "status": "OK", "built_at": build_date}
mock_requests.post.assert_called_with(
STATUS_ENDPOINT, json=expected_payload
)
常量.py
"""Definitions"""
STATUS_ENDPOINT = "http://localhost:8080/mrstatus"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.