python - pytest-mock assert_call_with 类函数失败
问题描述
我打算使用 pytest 和 pytest-mock 来验证 Python 代码。作为一个新手,写了一个示例代码来验证模拟类并看到失败。我想知道出了什么问题。
src/main.py
class Main(object):
def __init__(self, my_var=None):
self.var = my_var
def internal_func(self, var=10):
my_var = var + 20
return my_var
def test_func(self):
val = self.internal_func(20)
return val + 40
测试/test_main.py
import pytest
from pytest_mock import mocker
from src.main import Main
def new_func(cls, *args, **kwargs):
return 2
def test_main_mock(mocker):
mocker.patch.object(Main, 'internal_func')
val = Main().test_func()
assert Main.internal_func.assert_called_with(20)
它失败并出现以下错误
======================================================================================== FAILURES ========================================================================================
_____________________________________________________________________________________ test_main_mock _____________________________________________________________________________________
mocker = <pytest_mock.MockFixture object at 0x7f34f490d8d0>
def test_main_mock(mocker):
mocker.patch.object(Main, 'internal_func')
main = Main()
val = main.test_func()
# assert val == 80
> assert Main.internal_func.assert_called_with(20)
E AssertionError: assert None
E + where None = <bound method MagicMock.wrap_assert_called_with of <MagicMock name='internal_func' id='139865418160784'>>(20)
E + where <bound method MagicMock.wrap_assert_called_with of <MagicMock name='internal_func' id='139865418160784'>> = <MagicMock name='internal_func' id='139865418160784'>.assert_called_with
E + where <MagicMock name='internal_func' id='139865418160784'> = Main.internal_func
tests/test_main.py:13: AssertionError
解决方案
return_value 或 side_effect 必须在 patched func 生效之前设置
def test_main_mock(mocker):
# mock internal_func of class Main
mocked_internal_func = mocker.patch.object(Main, 'internal_func')
# assign return_value or side_effect
mocked_internal_func.return_value = -10
# class instance
ma = Main()
val = ma.test_func()
assert ma.internal_func.assert_called_with(20)
更正错误,assert不能和 一起使用
assert_called_with
,它们是独立的assert。
assert val == 30
mocked_internal_func.assert_called
ma.internal_func.assert_called_with(20)
mocked_internal_func.assert_called_with(20)
推荐阅读
- git - 如何挑选 HISTORY 提交并强制应用于当前分支
- laravel - http-tests 如何在打开表单的情况下对 ajax 事件进行测试?
- keras - 有人可以帮助解释 keras.backend.learning_phase_scope(1) 的使用吗?
- python - 如何在 Visual Studio 调试命令中使用环境变量
- heroku - 打开应用程序时出现应用程序错误
- algorithm - 在不排序的情况下查找数组中元素的排名
- shell - 使用shell的sql查询,尝试以下,它不工作
- sql - 从同一个表sql中获取不同列的最新和最早值
- sonarqube - 如果我在同一个项目中有多个目标文件夹的子目录,如何设置声纳属性
- php - 我如何使用 CURL ( Laravel ) 传递 SSL 证书