嘲笑一个功能

时间:2018-03-26 15:35:02

标签: python django python-3.x unit-testing

我试着想一下如何在helper.py中模拟一个函数,该函数在多个方法中用于单元测试。

我尝试使用补丁,@ patch('project.helpers.function_0',new = lambda:True)但是没有用。

这样做的正确方法是什么?

谢谢。

更新

我有1个函数和1个装饰器,我需要覆盖所有测试集。

helpers.py

def myfunction(asd):
    # ...
    return asd

decorators.py

def mydecorator(func):
    @wraps(func)
    def _wrapped_func(asd, *args, **kwargs):
        # ...
        return func(asd, *args, **kwargs)
    return _wrapped_func

我如何解决

我想知道如何使用模拟,谢谢!

test_base.py

import project.decorators
import project.helpers

def myfunction_mock(asd):
   # ...
   return asd
helpers.myfunction = myfunction_mock

def mydecorator_mock(func):
   # ...
decorators.mydecorator = mydecorator_mock

1 个答案:

答案 0 :(得分:0)

这里有一些关键的事情。

  1. 如果可能,您应该使用$ flutter packages get(或通过unittest.mock安装mock)。
  2. 您可能在错误的位置修补。
  3. 使用pip时,您可能希望使用mock.patch关键字参数,而不是new_callable
  4. 假设您的生产代码看起来像这样......

    new

    如果您想从生产代码中测试#production_module.py from helpers import myfunction def some_function(a): result = myfunction(a) + 1 return result ,请模拟some_function您的测试代码应修补myfunction而不是production_module.myfunction

    因此,您的测试代码可能如下所示

    helpers.myfunction

    使用import mock from production_module import some_function def mock_myfunction(*args, **kwargs): return 1 @mock.patch('production_module.myfunction', new_callable=mock_myfunction) def test_some_function(mock_func): result = some_function(1) # call the production function assert mock_func.called # make sure the mock was actually used assert result == 2 的另一种方式是作为上下文管理器。所以补丁只适用于那种情况。

    mock.patch