代码之家  ›  专栏  ›  技术社区  ›  FBryant87

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

  •  1
  • FBryant87  · 技术社区  · 7 年前

    在我的实现脚本中,有一行记录度量:

    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模块加载到缓存中。上述测试失败的原因是 一些函数() 不再使用模拟数据狗,而是使用真正的(缓存的)数据狗。

    我怎么解决这个问题?是否可以从缓存中删除模块?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Aurora Wang    7 年前

    你试过嘲笑 datalog 功能内的模块 test ? 只要您的其他脚本没有与您的测试同时运行,这就可以工作。这样,只有在调用函数时才会设置mock本身,而不是在脚本作用域中设置。

        2
  •  0
  •   soundstripe    7 年前

    你可以用 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()