assert_called_once_with() 与调用参数中的 datetime.now()?
assert_called_once_with() with datetime.now() in the call parameter?
我有下面的测试代码来测试Decorator
。
@mock.patch('a.b.c.KafkaProducer')
def test_1(self, mocked):
decorator = Decorator(....)
@decorator()
def test():
return 42
test()
start_time = ???
v = {'type': 'batch', 'start_time': start_time.isoformat()}
mocked.return_value.send.assert_called_once_with(value=v)
但是,测试总是失败,因为 Decorator
使用字典参数模拟调用,其中 start_time
的 属性 分配给 datetime.now()
。这是一种比较除 start_time
以外的所有内容的方法吗?或任何其他方式来测试调用?
两种实用方法:
使用https://pypi.org/project/freezegun/
冻结时间
import datetime
from freezegun import freeze_time
from unittest.mock import patch
import my_library
NOT_NOW = datetime.datetime.now()
@freeze_time("2020-01-01")
@patch("my_library.helper")
def test_foo(_helper):
my_library.under_test(NOT_NOW)
# kinda auto-magic
_helper.assert_called_once_with(datetime.datetime.now())
# or more explicitly
_helper.assert_called_once_with(datetime.datetime(2020, 1, 1))
或者,手动评估参数
@patch("my_library.helper", return_value=42)
def test_bar(_helper):
my_library.under_test(NOT_NOW)
assert _helper.call_count == 1
assert _helper.call_args[0][0]
assert _helper.call_args[0][0] != NOT_NOW
我有下面的测试代码来测试Decorator
。
@mock.patch('a.b.c.KafkaProducer')
def test_1(self, mocked):
decorator = Decorator(....)
@decorator()
def test():
return 42
test()
start_time = ???
v = {'type': 'batch', 'start_time': start_time.isoformat()}
mocked.return_value.send.assert_called_once_with(value=v)
但是,测试总是失败,因为 Decorator
使用字典参数模拟调用,其中 start_time
的 属性 分配给 datetime.now()
。这是一种比较除 start_time
以外的所有内容的方法吗?或任何其他方式来测试调用?
两种实用方法:
使用https://pypi.org/project/freezegun/
冻结时间import datetime
from freezegun import freeze_time
from unittest.mock import patch
import my_library
NOT_NOW = datetime.datetime.now()
@freeze_time("2020-01-01")
@patch("my_library.helper")
def test_foo(_helper):
my_library.under_test(NOT_NOW)
# kinda auto-magic
_helper.assert_called_once_with(datetime.datetime.now())
# or more explicitly
_helper.assert_called_once_with(datetime.datetime(2020, 1, 1))
或者,手动评估参数
@patch("my_library.helper", return_value=42)
def test_bar(_helper):
my_library.under_test(NOT_NOW)
assert _helper.call_count == 1
assert _helper.call_args[0][0]
assert _helper.call_args[0][0] != NOT_NOW