如何将 mock objects 传递给 pytest fixture

How can I pass mock objects to a pytest fixture

对不起这个标题,我一定要更新它...我有一个 pytest 测试函数:

def test_update_db():
    mock_connection = Mock(spec=Connection)
    db_updater = DbUpdater(mock_connection)

    db_updater.run("some parameter")

    mock_connection.gna.assert_called_with("some different parameter")

可行,但很丑:db_updater 确实应该是一个固定装置。但我必须将连接传递给它 object,所以我宁愿:

@pytest.fixture
def db_updater():
    mock_connection = Mock(spec=Connection)
    return DbUpdater(mock_connection)


def test_update_db(db_updater):
    db_updater.run("some parameter")
    mock_connection.gna.assert_called_with("some different parameter")

更好的测试功能,但有一个问题:mock_connection 不存在...我该如何解决这个问题?

您可以定义一个夹具以依赖于另一个夹具,然后将它们都作为测试中的参数。这应该有效:

import pytest

@pytest.fixture
def conn():
    return Mock(spec=Connection)

@pytest.fixture
def db_updater(conn):
    return DbUpdater(conn)

def test_update_db(conn, db_updater):
    db_updater.run("some parameter")
    conn.gna.assert_called_with("some different parameter")