跨多个测试脚本模拟Python模块
在我的实现脚本中,有一行记录了一个度量:跨多个测试脚本模拟Python模块,python,pytest,Python,Pytest,在我的实现脚本中,有一行记录了一个度量: from datadog import statsd def some_function: statsd.increment('some_metric') 从我的测试脚本中,我断言statsd.increment()是通过模拟datadog模块来调用的: datadog = Mock() sys.modules['datadog'] = datadog def test(): some_function() datadog.
from datadog import statsd
def some_function:
statsd.increment('some_metric')
从我的测试脚本中,我断言statsd.increment()是通过模拟datadog模块来调用的:
datadog = Mock()
sys.modules['datadog'] = datadog
def test():
some_function()
datadog.statsd.increment.assert_called()
这工作很好,通过了。但是,只要我添加另一个脚本,该脚本调用some_function()
,而不模拟datadog,该脚本就会预先运行,并将真正的datadog模块加载到缓存中。上述测试随后失败,因为some_function()
不再使用模拟数据狗,而是使用真实(缓存)数据狗
我如何解决这个问题?是否可以从缓存中删除模块?您是否尝试在函数
测试中模拟数据日志
模块?只要您的其他脚本没有与测试同时运行,这可能会起作用。这样,只有在调用函数时才会设置模拟本身,而不是在脚本范围内设置。您可以使用unittest.mock.patch
。如果您使用的是pytest,那么您可以对monkeypatch
fixture执行相同的操作
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()
你是说它失败是因为它得到的是“模拟数据狗”而不是“真正的数据狗”?它在得到模拟数据狗时通过了,现在它失败了,因为以前运行的测试已经执行了它,给它一个真正的数据狗,然后缓存它(因此以后不能使用模拟数据狗)测试不会同时运行,但问题在于顺序。不模拟模块的测试首先运行并缓存模块,这样之后运行的任何测试都不会模拟模块。