如何模拟 basic_get 函数?
How to mock basic_get function?
我想模拟 pika basic_get 函数,它没有直接导入到我的任何模块中。结果输出指向 MagicMock 对象,但是当我在测试函数中直接调用 basic_get 时,模拟有效。我可以采取什么步骤来解决这个问题?
cli.py
@click.command
def main():
connection, channel = get_con()
message = channel.basic_get('some_queue', no_ack=True)
print(message)
con.py
def get_con.py
parameters = pika.URLParameters('amqp://')
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
return connection, channel
test.py
@patch('pika.channel.Channel.basic_get')
def test_something(basic_get_mock):
with patch('con.get_con', return_value=(MagicMock(), MagicMock())) as get_con_mock:
basic_get_mock.return_value = 45
runner = CliRunner()
result = runner.invoke(main)
print(result.output)
您已经在模拟 get_con
,因此无需模拟原始 class;只需配置您已经创建的模拟。
def test_something():
mock_conn = MagicMock()
mock_channel = MagicMock()
with patch('con.get_con', return_value=(mock_conn, mock_channel)):
mock_channel.basic_get.return_value = 45
runner = CliRunner()
result = runner.invoke(main)
print(result.output)
我想模拟 pika basic_get 函数,它没有直接导入到我的任何模块中。结果输出指向 MagicMock 对象,但是当我在测试函数中直接调用 basic_get 时,模拟有效。我可以采取什么步骤来解决这个问题?
cli.py
@click.command
def main():
connection, channel = get_con()
message = channel.basic_get('some_queue', no_ack=True)
print(message)
con.py
def get_con.py
parameters = pika.URLParameters('amqp://')
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
return connection, channel
test.py
@patch('pika.channel.Channel.basic_get')
def test_something(basic_get_mock):
with patch('con.get_con', return_value=(MagicMock(), MagicMock())) as get_con_mock:
basic_get_mock.return_value = 45
runner = CliRunner()
result = runner.invoke(main)
print(result.output)
您已经在模拟 get_con
,因此无需模拟原始 class;只需配置您已经创建的模拟。
def test_something():
mock_conn = MagicMock()
mock_channel = MagicMock()
with patch('con.get_con', return_value=(mock_conn, mock_channel)):
mock_channel.basic_get.return_value = 45
runner = CliRunner()
result = runner.invoke(main)
print(result.output)