我遇到了一個問題,我認爲這可能是我使用的庫的一個錯誤。不過,我對python,unittest和unittest.mock庫相當陌生,所以這可能只是我理解中的一個漏洞。生產類構造函數需要額外參數時,爲什麼unittest.mock失敗?
同時加入測試,一些生產代碼,我遇到了一個錯誤,我已經產生再現這一問題的最少的樣品:
import unittest
import mock
class noCtorArg:
def __init__(self):
pass
def okFunc(self):
raise NotImplemented
class withCtorArg:
def __init__(self,obj):
pass
def notOkFunc(self):
raise NotImplemented
def okWithArgFunc(self, anArgForMe):
raise NotImplemented
class BasicTestSuite(unittest.TestCase):
"""Basic test Cases."""
# passes
def test_noCtorArg_okFunc(self):
mockSUT = mock.MagicMock(spec=noCtorArg)
mockSUT.okFunc()
mockSUT.assert_has_calls([mock.call.okFunc()])
# passes
def test_withCtorArg_okWithArgFuncTest(self):
mockSUT = mock.MagicMock(spec=withCtorArg)
mockSUT.okWithArgFunc("testing")
mockSUT.assert_has_calls([mock.call.okWithArgFunc("testing")])
# fails
def test_withCtorArg_doNotOkFuncTest(self):
mockSUT = mock.MagicMock(spec=withCtorArg)
mockSUT.notOkFunc()
mockSUT.assert_has_calls([mock.call.notOkFunc()])
if __name__ == '__main__':
unittest.main()
如何我進行的測試,輸出如下:
E:\work>python -m unittest testCopyFuncWithMock
.F.
======================================================================
FAIL: test_withCtorArg_doNotOkFuncTest (testCopyFuncWithMock.BasicTestSuite)
----------------------------------------------------------------------
Traceback (most recent call last):
File "testCopyFuncWithMock.py", line 38, in test_withCtorArg_doNotOkFuncTest
mockSUT.assert_has_calls([mock.call.notOkFunc()])
File "C:\Python27\lib\site-packages\mock\mock.py", line 969, in assert_has_calls
), cause)
File "C:\Python27\lib\site-packages\six.py", line 718, in raise_from
raise value
AssertionError: Calls not found.
Expected: [call.notOkFunc()]
Actual: [call.notOkFunc()]
----------------------------------------------------------------------
Ran 3 tests in 0.004s
FAILED (failures=1)
我使用python 2.7.11,通過pip安裝模擬版本2.0.0。
對於我在做什麼的任何建議是錯誤的?或者這看起來像庫中的錯誤?
不太清楚你的具體問題,但只是一個Python編碼注 - Python2.7類,你總是要繼承'對象',即'class WithCtorArg(object):'。此外,類名通常以大寫字母開頭(儘管我意識到可能剛剛在翻譯成您的MCVE時迷失了)。 – dwanderson
謝謝@dwanderson。 –