我有以下配置類:懲戒屬性調用返回MagicMock,不珍惜
class ConfigB(object):
Id = None
def __Init__(self, Id):
self.Id = Id
這是在下面的類實例化,以及屬性印刷:
from config.ConfigB import ConfigB
class FileRunner(object):
def runProcess(self, Id)
cfgB = ConfigB(Id)
print(cfgB.Id)
我已經創建瞭如下測試類來測試它,其中我試圖模擬實例化和cfgB.Id屬性調用:
import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner
class TestFileRunner(unittest.TestCase):
@mock.patch('ConfigB.ConfigB.__init__')
@mock.patch('ConfigB.ConfigB.Id')
def test_methodscalled(self, cfgBId, cfgBInit):
fileRunner = FileRunner()
cfgBId.return_value = 17
cfgBInit.return_value = None
print(cfgBId)
fileRunner.runProcess(1)
注fileRunner之前打印(cfgBId)語句被調用。我得到以下輸出:
<MagicMock name='Id' id='157297352'>
<MagicMock name='Id' id='157297352'>
出於某種原因,當我在測試類此處設置的返回值:
cfgBId.return_value = 17
,在FileRunner是沒有得到所謂的上線()類:
print(cfgB.Id)
我需要做些什麼才能正確顯示我的配置屬性?
還要注意的是我的「ConfigB」類的實例要複雜得多,高於該比顯示就是爲什麼我要修補的實例化和調用ID屬性。
*更新:我已經改變了我的課由@mgilson的建議,但它仍然不工作:
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):
fileRunner = FileRunner()
cfgB.Id = 17
print(cfgBId)
fileRunner.runProcess(1)
我現在正從兩個print語句的輸出如下:
<MagicMock name='ConfigB' id='157793640'>
<MagicMock name='ConfigB().Id' id='157020512'>
任何想法,爲什麼上面不工作?
*解決方案:
我能得到它的一個小的改動,以測試方法@mgilson建議後工作:
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):
fileRunner = FileRunner()
cfgB().Id = 17
print(cfgBId)
fileRunner.runProcess(1)
我現在得到以下的輸出:
<MagicMock name='ConfigB' id='157147936'>
17
所以我試圖實現(見我的帖子上的編輯),但我仍然沒有得到正確的輸出。 – EliSquared
Acutally @mgilson我能夠讓它工作我想我只是將代碼中的行從'cfgB.Id = 17'更改爲'cfgB()。Id = 17'。括號改變了一切。這對你有意義嗎?如果您編輯您的帖子以包含括號,我可以將其標記爲解決方案。 – EliSquared
@EliSquared - 是的,這很有道理。你想把'Id'附加到你的模擬的'return_value',而不是模擬本身(我的壞)。我編輯了代碼來反映這一點。 – mgilson