簡體   English   中英

通過用新方法替換它來模擬模型類的實例方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM