问题描述
我正在构建一个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 (将#修改为@)