我试图测试一个函数,我通过列表进行迭代,并为列表中的每个项目调用os.path.exists
。我的测试是将函数传递给2个对象的列表。我需要os.path.exists
为其中一个返回True
,为另一个返回False
。我曾经尝试这样做:模拟/修补程序os.path.exists具有多个返回值
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
后。
如果函数在两个调用中具有相同的参数会怎样? – hithwen
你是什么意思?如果'os.path.exists'传递给两个调用的1?然后它会返回True,因为这是副作用所说的。但是它不会被同一个参数传递两次,因为'test'函数遍历'arg_list'并为列表中的每个元素调用'os.path.exists'。所以只要列表中的两个元素都不是“1”,那么它将按预期工作。 –
我的意思是,如果我想用相同的参数调用os.path.exists两次,并返回第一个False,然后返回True。我想出了如何定义一个函数来计算被调用了多少次并返回不同的值并将其用作side_effect。 – hithwen