首页 > 解决方案 > 如何在模块中模拟一个方法而不是模拟整个模块

问题描述

我的目的是模拟utcnow. 我正在使用pytest它并且非常新。

my_file.py模块内及模块下的方法my_module

import datetime

def get_date_info() -> Tuple[int, str]:
    now_epoch = int(datetime.utcnow().strftime("%s"))
    # do something with now_epoch
    calculated_epoch = ...

    # another variable relies on datetime
    another_variable = datetime.fromtimestamp(calculated_epoch).strftime("%H")
return (now_epoch, another_variable)

pytest对该方法的测试:

from my_module.my_file import get_date_info
import datetime
import mock

@mock.patch("my_module.my_file.datetime")
def test_get_date_info():
        mock_dt.utcnow = mock.Mock(return_value=datetime.datetime(2002, 1, 1))
        actual_epoch, actual_another_variable = get_date_info()
        # assert code here 

返回的模拟actual_epoch日期是准确的,不幸的是下面的代码没有返回 str 但是 <MagicMock name='datetime.fromtimestamp().strftime()' id='140249763149088'>

datetime.fromtimestamp(calculated_epoch).strftime("%H")

有谁知道是什么导致了这个问题,我该如何解决?

标签: pythonpython-3.xpytestpython-mock

解决方案


问题是你只是utcnow在模拟,所以当在实际代码中调用 utcnow - 它返回你的模拟值。您还必须模拟datetime.fromtimestamp它才能返回您的模拟值。例如:

mock_dt.fromtimestamp = mock.Mock(return_value=datetime.datetime(2002, 1, 1))

推荐阅读