gpt4 book ai didi

python - 模拟/补丁 os.path.exists 具有多个返回值

转载 作者:太空狗 更新时间:2023-10-30 03:02:26 24 4
gpt4 key购买 nike

我正在尝试测试我创建的一个函数,该函数遍历列表,并为列表中的每个项目调用 os.path.exists。我的测试是向函数传递一个包含 2 个对象的列表。我需要 os.path.exists 为其中一个返回 True,为另一个返回 False。我试过这个:

import mock
import os
import unittest

class TestClass(unittest.TestCase):
values = {1 : True, 2 : False}
def side_effect(arg):
return values[arg]

def testFunction(self):
with mock.patch('os.path.exists') as m:
m.return_value = side_effect # 1
m.side_effect = side_effect # 2

arglist = [1, 2]
ret = test(argList)

使用第 1 行和第 2 行中的任一个但不是同时使用会给出 NameError: global name 'side_effect' is not defined

我找到了这个 question并像这样修改我的代码:

import mock
import os

class TestClass(unittest.TestCase):
values = {1 : True, 2 : False}
def side_effect(arg):
return values[arg]

def testFunction(self):
mockobj = mock(spec=os.path.exists)
mockobj.side_effect = side_effect

arglist = [1, 2]
ret = test(argList)

这会产生 TypeError: 'module' object is not callable。我还尝试切换这些行:

mockobj = mock(spec=os.path.exists)
mockobj.side_effect = side_effect

为此

mockobj = mock(spec=os.path)
mockobj.exists.side_effect = side_effect

还有这个

mockobj = mock(spec=os)
mockobj.path.exists.side_effect = side_effect

产生了同样的错误。任何人都可以指出我做错了什么以及我可以做些什么来让它发挥作用吗?

编辑:在下面发布我的答案后,我意识到我的第一段代码实际上也能正常工作,我只需要 m.side_effect = TestClass.side_effect 而不是 m.side_effect = side_effect

最佳答案

所以经过更多的研究和反复试验,这里有大部分例子:http://www.voidspace.org.uk/python/mock/patch.html ,我解决了我的问题。

import mock
import os

def side_effect(arg):
if arg == 1:
return True
else:
return False

class TestClass(unittest.TestCase):
patcher = mock.patch('os.path.exists')
mock_thing = patcher.start()
mock_thing.side_effect = side_effect
arg_list = [1, 2]
ret = test(arg_list)
self.assertItemsEqual([1], ret)

testarg_list 中的每个项目调用 os.path.exist,并返回 os.exist 所有项目的列表。 path.exist 返回了 True。这个测试现在通过了我想要的结果。

关于python - 模拟/补丁 os.path.exists 具有多个返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21927057/

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