如何使用Mockito模拟对Python docker SDK的调用?

问题描述

我正在构建一个Flask应用程序,该应用程序可以使用自定义映像启动和停止Docker容器。为了测试我的实现,我想模拟对Docker SDK的调用。特别是,我希望对client.containers.run()调用失败并出现ImageNotFound错误,以测试发生这种情况时我的Flask应用程序不会崩溃(例如,如果我使用错误的图像名称配置了该应用程序)。我使用python-mockito进行模拟是因为我对原始的Mockito框架很熟悉。我更喜欢使用python-mockito的解决方案,但不限于此特定的模拟框架。

幸运的是,我能够使用此pytest重现此行为:

import docker
import pytest
from docker.errors import ImageNotFound
from mockito import when

def test_mre():
    client = docker.from_env()
    when(client.containers).run(...).thenRaise(ImageNotFound('404 Client Error: Not Found'))

    with pytest.raises(ImageNotFound):
        client.containers.run('alpine:latest','echo hello world')

测试失败是因为没有引发ImageNotFound错误,而是在高山容器中执行了echo hello world

CONTAINER ID        IMAGE                   COMMAND                  CREATED              STATUS                          PORTS                    NAMES
d68116db0e9b        alpine:latest           "echo hello world"       3 seconds ago        Exited (0) 2 seconds ago                                 laughing_jones

如何如上所述模拟对client.containers.run()的呼叫?


更新:同时,我能够使用unittest.mock模拟run()调用

from unittest.mock import patch
from docker.models.containers import ContainerCollection

@patch.object(ContainerCollection,'run',side_effect=ImageNotFound('404 Client Error'))
def test_mre(mock_run):
    client = docker.from_env()

    with pytest.raises(ImageNotFound):
        client.containers.run('alpine:latest','echo hello world')

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)