跨多个测试脚本模拟Python模块

时间:2018-11-15 16:22:17

标签: python pytest

在我的实施脚本中,有一行记录了指标:

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()不再使用模拟数据狗,而是使用了真实的(缓存的)数据狗。

我该如何解决?是否可以从缓存中删除模块?

2 个答案:

答案 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()