我对于问这样一个简单的问题感到很不高兴,但对于为什么这个示例无法按预期工作,我确实感到困惑。我希望以下断言的值为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 ===================
答案 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 中的方法,这就是为什么您需要从此文件中模拟该方法的原因。