【问题标题】:Mocking a function模拟一个函数
【发布时间】:2018-09-04 19:48:29
【问题描述】:

我试图弄清楚如何在 helper.py 中模拟一个用于单元测试的多种方法中的函数。

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

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

谢谢。


更新

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

helpers.py

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

装饰器.py

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

我是如何解决的

我想知道如何使用 mock,谢谢!

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

【问题讨论】:

  • 您要查找的关键字参数是new_callable,而不是new。见the docs
  • 对我不起作用,这样在测试中给出和额外的 arg,我需要覆盖所有测试的函数。 function_0 在我调用的其他方法中被调用...
  • 究竟是什么不起作用?请使用您的测试用例代码更新您的问题并描述意外行为和期望行为。
  • @sytech 用更多数据更新问题,谢谢你的回答。

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


【解决方案1】:

这里发生了一些关键的事情。

  1. 如果可能,您应该使用unittest.mock(或通过pip 安装的mock)。
  2. 您可能在错误的位置进行了修补。
  3. 使用mock.patch 时,您可能希望使用new_callable 关键字参数,而不是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 的另一种方式是作为上下文管理器。所以补丁只适用于那个上下文。

with mock.patch(...) as mock_func:
    some_function(1) # mock_func is called here

some_function(1) # the mock is no longer in place here

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2017-02-04
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多