在我的实施脚本中,有一行记录了指标:
from datadog import statsd
def some_function:
statsd.increment('some_metric')
在我的测试脚本中,我断言通过嘲笑datadog模块来调用statsd.increment():
datadog = Mock()
sys.modules['datadog'] = datadog
def test():
some_function()
datadog.statsd.increment.assert_called()
这正常工作并通过。但是,一旦我添加了一个无需仿真datadog就调用some_function()
的ANOTHER脚本,该脚本就会预先运行并将实际的datadog模块加载到缓存中。然后,上述测试失败了,因为some_function()
不再使用模拟数据狗,而是使用了真实的(缓存的)数据狗。
我该如何解决?是否可以从缓存中删除模块?
答案 0 :(得分:0)
您是否尝试过模拟函数datalog
中的test
模块?只要您的其他脚本未在测试中同时运行,这可能会起作用。这样,仅在调用函数时才会设置模拟本身,而不是在脚本范围内进行设置。
答案 1 :(得分:0)
您可以使用unittest.mock.patch
。如果您使用的是pytest,则可以使用monkeypatch
固定装置进行相同的操作。
from datadog import statsd
from unittest.mock import Mock, patch
def some_function():
statsd.increment()
def test_some_function():
with patch('datadog.statsd', Mock()) as mock_statsd:
some_function()
mock_statsd.increment.assert_called()
test_some_function()