python - 如何在模块中模拟一个方法而不是模拟整个模块
问题描述
我的目的是模拟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")
有谁知道是什么导致了这个问题,我该如何解决?
解决方案
问题是你只是utcnow
在模拟,所以当在实际代码中调用 utcnow - 它返回你的模拟值。您还必须模拟datetime.fromtimestamp
它才能返回您的模拟值。例如:
mock_dt.fromtimestamp = mock.Mock(return_value=datetime.datetime(2002, 1, 1))
推荐阅读
- java - Eclipse 自动完成出现在屏幕外
- json - 如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?
- angular - 如何订阅具有路径变量 Spring boot - Angular - Websocket - 的端点
- c# - 如何从网站开始 Kubernetes 工作?
- java - Spring Data JPA:如何从嵌套的一对一关系中获取数据?
- spring - SimpMessageHeaderAccessor 如何传递给@messagemapping 函数?
- layout - 如何在 graphviz 中设置三车道布局/排名?
- dictionary - 字典数组中的 scikit-learn 电源变压器
- db2 - 表的 MD5 哈希
- vmware-workstation - 如何修复变成黑屏的 VMWare 工作站