跨多个测试脚本模拟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()

你是说它失败是因为它得到的是“模拟数据狗”而不是“真正的数据狗”?它在得到模拟数据狗时通过了,现在它失败了,因为以前运行的测试已经执行了它,给它一个真正的数据狗,然后缓存它(因此以后不能使用模拟数据狗)测试不会同时运行,但问题在于顺序。不模拟模块的测试首先运行并缓存模块,这样之后运行的任何测试都不会模拟模块。