我有以下的配置类:嘲笑类和返回几个值
class ConfigB(object):
Id = None
fileName = None
def __init__(self, file):
self.Id = self.searchForId(file)
self.fileName = file
这是在下面的类实例化多次和属性进行访问:
from config.ConfigB import ConfigB
class FileRunner(object):
def runProcess(self, cfgA)
for file in cfgA.listFiles:
cfgB = ConfigB(file)
print(cfgB.Id)
print(cfgB.fileName)
为了测试它,我创建以下测试类,我模拟ConfigB为FileRunner类:
import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner
class TestFileRunner(unittest.TestCase):
@mock.patch('FileRunner.ConfigB')
def test_methodscalled(self, cfgB):
cfgA = Mock()
cfgA.listFiles = ['File1','File2']
cfgB().Id.side_effect = [1,2]
cfgB().fileName.side_effect = ['File1','File2']
fileRunner = FileRunner()
fileRunner.runProcess(cfgA)
我正在尝试为cfgB获取模拟以为'Id'和'fileName'返回多个值。如果我使用cfgB().fileName = 'File1'
,我可以得到cfgB的模拟函数来返回'File1'两次,但我更喜欢如果我可以遍历多个返回值。是可以做的事吗?
*编辑:我想明确指出,上述测试没有返回的特定值的工作,而是我得到下面的输出:
<MagicMock name='cfgB().Id' id='160833320'>
<MagicMock name='cfgB().fileName' id='160833320'>
<MagicMock name='cfgB().Id' id='160833320'>
<MagicMock name='cfgB().fileName' id='160833320'>
有几个与你的代码的问题:1.第一种方法是''__init__''而不是''__Init__' '; 2.''Id''和''FileName''是类变量,可能会导致意外的结果,如[这里]所述(https://docs.python.org/3.6/tutorial/classes.html#class-and-实例变量)。您可以简单地删除它们,只在'__init__''方法中留下分配。这**可能会解决你的问题(我没有测试过,它可能不是解决方案) –
'__init__'和'__Init__'是一个不在我的实际代码中的错字,我在上面修复了它。我不想离开'__init__'方法,因为实际的'__init__'方法使得我的代码复杂得多,所以我宁愿只模拟返回值。 – EliSquared