我有以下的配置類:嘲笑類和返回幾個值
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