如何正确使用patch.object()



我试图了解Mock和patch(),但我被困在一个有点简单的例子上。假设我在main.py中有以下函数,用于测试它是否为工作日。

from datetime import datetime
def is_weekday():
today = datetime.today()
return (0 <= today.weekday() < 5)

我想用两种可能的结果运行我的测试:如果我模拟周六或周日,FalseTrue,如果它是工作日。现在,当调用main.is_weekday时,我显然没有嘲笑任何东西,所以我的测试目前失败了,因为它是周末。我怎样才能解决这个问题呢?

from unittest.mock import Mock, patch
import pytest
import main
def test_weekday():
datetime = Mock()
tuesday = datetime(year=2019, month=1, day=1)
datetime.today.return_value = tuesday
with patch.object(datetime, "main.is_weekday", tuesday) as mock_method:
expected = True
actual = main.is_weekday() # how do I mock datetime.today()?
assert actual == expected

根本问题是您没有在main模块中修补datetimepatch.object的第一个参数是您想要修补的东西,由于您传递的是datetimeMock对象,因此这对您没有任何好处。

我将重构你的测试:

from unittest.mock import Mock, patch
from datetime import datetime
from mockito import when, ANY
import main

def test_weekday():
testdate = datetime(year=2019, month=1, day=1)
with patch("main.datetime", wraps=datetime) as mock_datetime:
mock_datetime.today.return_value = testdate
assert main.is_weekday()

def test_weekend():
testdate = datetime(year=2019, month=1, day=5)
with patch("main.datetime", wraps=datetime) as mock_datetime:
mock_datetime.today.return_value = testdate
assert not main.is_weekday()

在这里,我们用一个模拟对象替换main.datetime,然后配置它,以便在main模块中调用datetime.today()将返回一个特定的日期。

然后我们测试代码在工作日和工作日都能正常工作周末。

最新更新