全部,
我有一堂类似的课。
from mod import Bar
class Foo:
def __init__(self):
self.obj = Bar()
如何Bar
使用 pytest / pytest-mock 模拟构造函数?我尝试了以下失败。
def test():
with mock.patch('mod.Bar') as patched:
Foo()
全部,
我有一堂类似的课。
from mod import Bar
class Foo:
def __init__(self):
self.obj = Bar()
如何Bar
使用 pytest / pytest-mock 模拟构造函数?我尝试了以下失败。
def test():
with mock.patch('mod.Bar') as patched:
Foo()
您必须修补名称,而不是实例。
来自官方 Python 文档:在哪里打补丁
patch() 通过(临时)将名称指向的对象更改为另一个对象。可以有许多名称指向任何单个对象,因此要使修补工作正常,您必须确保修补被测系统使用的名称。
在您的示例中,您的类Foo
是在模块中定义的foomod.py
,因此您必须修补foomod.Bar
而不是mod.Bar
.
mocker
您可以使用来自pytest-mock
或 with的夹具将其放入夹具中unittest.mock.patch
。
@pytest.fixture # With pytest-mock
def mock_bar(mocker):
return mocker.patch('foomod.Bar')
@pytest.fixture # With stdlib
def mock_bar():
with patch('foomod.Bar') as mock:
yield mock
# Usage
def test_foo(mock_bar):
pass
据我所知,这两种方法之间没有显着差异。当夹具超出范围时,两者都会被清理。
我使用以下内容来模拟pytest
没有fixture
装饰器的对象
# path.to.MyClass
class MyClass():
def __init__(self, some_parameter: SomeObject) -> None:
self.some_value = some_parameter
def get_something(self) -> str:
return 'Hello'
# tests.py
from pytest_mock.plugin import MockerFixture
from unittest.mock import MagicMock
def test_with_mock(mocker: MockerFixture) -> None:
mock_myclass: MagicMock = mocker.patch('path.to.MyClass')
mock_myclass_get_something: MagicMock = mocker.patch('path.to.MyClass.get_something')
mock_myclass_get_something.return_value = 'World!'
assert mock_myclass.get_something() == 'World!'