pytest - 构造函数中的模拟构造函数

Dan*_*ahn 4 pytest python-3.x pytest-mock

全部,

我有一个类似的课程。

from mod import Bar

class Foo:
  def __init__(self):
    self.obj = Bar()
Run Code Online (Sandbox Code Playgroud)

如何Bar使用 pytest / pytest-mock 模拟构造函数?我尝试了以下失败。

def test():
  with mock.patch('mod.Bar') as patched:
    Foo()
Run Code Online (Sandbox Code Playgroud)

Ale*_*ing 5

您必须修补名称,而不是实例。

来自官方 Python 文档:在哪里打补丁

patch() 通过(临时)将名称指向的对象更改为另一个对象。可以有许多名称指向任何单个对象,因此要使修补工作,您必须确保修补被测系统使用的名称。

在您的示例中,您的类Foo是在 module 中定义的foomod.py,因此您必须使用 patchfoomod.Bar而不是mod.Bar.

您可以通过使用mocker来自pytest-mock或使用的夹具将其放入夹具中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
Run Code Online (Sandbox Code Playgroud)

据我所知,这两种方法之间没有显着差异。当夹具超出范围时,两者都会被清理。