模拟另一个函数使用的python函数

时间:2018-12-13 22:58:23

标签: python mocking

我对于问这样一个简单的问题感到很不高兴,但对于为什么这个示例无法按预期工作,我确实感到困惑。我希望以下断言的值为70会失败,但是测试的值为30。

以下内容位于称为calc的pip包中:

calc/__init__.py
from .calculator import *


calc/calculator.py
def get_value_1():
    return 10


def get_value_2():
    return 20


def addition():
    return get_value_1() + get_value_2()


test/simple.test
import calc
@mock.patch('calc.get_value_1', return_value=50)
def test1(mock_data):
    value = calc.addition()
    assert value == 30

Test output:
plugins: cov-2.6.0, nbval-0.9.1
collected 1 item                                                                                                                                             

test/simple_test.py::test6 PASSED

================= 1 passed in 0.21 seconds ===================

2 个答案:

答案 0 :(得分:2)

确保要修补正确的目标。具体来说,请点击此处的“哪里打补丁”部分:https://docs.python.org/3/library/unittest.mock.html#id5

在您发布的文件中,似乎有些名称混在一起了(例如,“ calc”或“ calculator”)。请务必通读docs,尤其是:

  

target应该是“ package.module.ClassName”形式的字符串。导入目标并将指定的对象替换为新对象,因此目标必须可从您从其调用patch()的环境中导入。

修补程序(如果您刚刚开始这样做)可能会令人困惑/发疯。也许在测试中添加import pdb; pdb.set_trace()(调试器)。这将暂停此语句的测试。然后,您可以检查get_value_1给您的东西。如果其类型为MagicMock或其他类似类型,则补丁成功。如果不是,则您无法修补正确的东西,应更改目标路径。希望这会有所帮助!

也:您确定@mock.patch('calc.get_value_1', return_value=50)可以工作吗?我会尝试mock.patch('calc.get_value_1'),然后在测试函数中添加mock_data.return_value = 50。我以前没看过你的路,对源代码进行简短的挖掘也没有显示出它可以工作(也没有显示出它也不能工作!)-值得一试。

答案 1 :(得分:2)

@JulienChein的答案非常好,我将根据您的摘录添加一些示例。

我创建了一个与您相似的环境。

.
├── calculator.py
├── __init__.py
└── test
    ├── __init__.py
    └── test_calc.py

calculator.py

def get_value_1():
    return 10

def get_value_2():
    return 20

def addition():
    return get_value_1() + get_value_2()

__ init __。py

from .calculator import *

test / test_calc.py

from unittest.mock import patch
from .. import addition

# Here get_value_1, is mocked from calc.__inti__.py
@patch('calc.get_value_1', return_value=50)
def test1(mock_data):
    value = addition()
    assert value == 30  # This assert is False

# Here get_value_1, is mocked from calc.calculator.py
@patch('calc.calculator.get_value_1', return_value=50)
def test2(mock_data):
    value = addition()
    assert value == 70  # This assert is True

重点是addition使用 calc.calculator.py 中的方法,这就是为什么您需要从此文件中模拟该方法的原因。