在我嘗試學習TDD時,試圖學習單元測試和使用python進行模擬。慢慢地掌握它,但不確定我是否正確地做到了這一點。預先警告:我使用python 2.4,因爲供應商API是預編譯的2.4 pyc文件,所以我使用模擬0.8.0和單元測試(不是unittest2)如何在單元測試中正確使用python模擬setUp
鑑於此示例代碼在'mymodule.py '
import ldap
class MyCustomException(Exception):
pass
class MyClass:
def __init__(self, server, user, passwd):
self.ldap = ldap.initialize(server)
self.user = user
self.passwd = passwd
def connect(self):
try:
self.ldap.simple_bind_s(self.user, self.passwd)
except ldap.INVALID_CREDENTIALS:
# do some stuff
raise MyCustomException
現在在我的測試用例文件'test_myclass.py'中,我想模擬ldap對象。 ldap.initialize返回ldap.ldapobject.SimpleLDAPObject,所以我想這將是我不得不嘲笑的方法。
import unittest
from ldap import INVALID_CREDENTIALS
from mock import patch, MagicMock
from mymodule import MyClass
class LDAPConnTests(unittest.TestCase):
@patch('ldap.initialize')
def setUp(self, mock_obj):
self.ldapserver = MyClass('myserver','myuser','mypass')
self.mocked_inst = mock_obj.return_value
def testRaisesMyCustomException(self):
self.mocked_inst.simple_bind_s = MagicMock()
# set our side effect to the ldap exception to raise
self.mocked_inst.simple_bind_s.side_effect = INVALID_CREDENTIALS
self.assertRaises(mymodule.MyCustomException, self.ldapserver.connect)
def testMyNextTestCase(self):
# blah blah
信息我幾個問題:
- 是否正確? :)
- 這是正確的方法來嘗試和模擬一個對象,在我正在測試的類內實例化?
- 可以在setUp上調用@patch裝飾器,或者這會導致奇怪的副作用嗎?
- 有沒有辦法讓模擬來提升ldap.INVALID_CREDENTIALS異常而不必將異常導入到我的測試用例文件中?
- 我應該使用patch.object()來代替嗎?如果是這樣,怎麼辦?
謝謝。
1-3)似乎沒什麼問題... 4)'進口ldap'代替,並設置'side_effect = ldap.INVALID_CREDENTIALS'? – Chris 2013-04-04 22:28:38
您可以隨時進行相同的測試,但只能使用自己製作的簡單對象... – shackra 2014-05-11 20:09:36