用新方法替换模型类的模拟实例方法

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

我想通过模拟在单元测试中用新函数替换实例方法“ 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()
python unit-testing class mocking side-effects
1个回答
0
投票

请参阅此示例。

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
    )
© www.soinside.com 2019 - 2024. All rights reserved.