gpt4 book ai didi

python - 如何使用 pytest 模拟导入的模块

转载 作者:行者123 更新时间:2023-12-01 09:08:33 25 4
gpt4 key购买 nike

以前曾问过类似的问题,但我正在努力使其发挥作用。

如何从另一个文件模拟导入模块

我有一个文件:
b.py(命名与链接文档一致)

import cv2   # module 'a' in the linked docs

def get_video_frame(path):
vidcap = cv2.VideoCapture(path) # `a.SomeClass` in the linked docs
vidcap.isOpened()
...

test_b.py

import b
import pytest # with pytest-mock installed

def test_get_frame(mocker):

mock_vidcap = mocker.Mock()
mock_vidcap.isOpened.side_effect = AssertionError

mock_cv2 = mocker.patch('cv2.VideoCapture')
mock_cv2.return_value = mock_vidcap

b.get_video_frame('foo') # Doesn't fail

mock_vidcap.isOpened.assert_called() # fails

我像这样设置测试,因为在 where to patch 中它指定如果

In this case the class we want to patch is being looked up on the a module and so we have to patch a.SomeClass instead:

@patch(‘a.SomeClass’)

我尝试了一些其他的修补组合,但它表现出相同的行为,这表明我没有成功修补模块。如果要应用补丁,b.get_video_frame('foo') 将由于side_effect而失败; assert_used 失败,支持这一点。

编辑,以减少我在 get_video_frame 的其余部分中留下的问题的长度。不幸的是,我们留下的部分是关键部分。完整功能为:

def get_video_frame(path):
vidcap = cv2.VideoCapture(path) # `a.SomeClass` in the linked docs
is_open = vidcap.isOpened()
while True:
is_open, frame = vidcap.read()
if is_open:
yield frame
else:
break

最佳答案

这一行只是创建一个生成器:

b.get_video_frame('foo')

永远不会到达 is_open = vidcap.isOpened() 行,因为在测试函数中,生成器在开始时保持卡住状态,因此副作用永远不会出现。

您正确使用了模拟程序和补丁。

关于python - 如何使用 pytest 模拟导入的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51850478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com