說我有一個類:如何在python單元測試中模擬類變量值?
class A():
def f(self):
self._v = 1
嘗試:
m=Mocker()
A.f._v = m.mock()
...
,但沒有奏效。不知道如何......
說我有一個類:如何在python單元測試中模擬類變量值?
class A():
def f(self):
self._v = 1
嘗試:
m=Mocker()
A.f._v = m.mock()
...
,但沒有奏效。不知道如何......
你的意思是Mock library?
from mock import Mock
real = ProductionClass()
real.method = Mock(return_value=3)
real.method(3, 4, 5, key='value')
編輯:
您正在試圖嘲諷這是不可能的前訪問A.f._v。 不知道什麼是你想這樣做,但這種將工作
>>>A.f = Mock()
>>>a = A()
>>>a.f._v
<Mock name='mock._v' id='42076240'>
類定義顯示了一個實例變量,從這個類的外部設置它,做這樣的事情:
class A:
def f(self):
self._v = 1
a = A()
a._v = Mock()
如果您其實想真正的類變量,試試這個:
class A():
_v = None
def f(self):
self.__class__._v = 1
A._v = Mock()
我嘗試了上述解決方案,它仍然沒有解決我的目的,這正是最初問。上面的方法會更新我的類的模擬屬性以獲得值。
我的要求是從我在單元測試類中提供的模擬值中設置屬性值。
我終於可以通過以下方法解決這個問題了。讓我知道,如果它不是一個正確的方法:
實際類:
class ActualClass(object):
name=''
def some_method(self):
name=get_name_from_external_source() #Say, returned name='ActualValue'
print name
的單元測試類:
from mock import PropertyMock
import unittest
class TestActualClass(unittest.TestCase):
def test_some_method(self):
actual_class=ActualClass()
p=PropertyMock(return_value='Mocked_Name')
type(actual_class).name=p
actual_class.some_method()
當你some_method在ActualClass通過正常執行運行,輸出:
ActualValue
當您運行TestActualClass時,輸出:
Mocked_Name
這意味着類屬性會使用PropertyType與模擬值進行模擬,您可以使用模擬值測試該方法,而無需擔心外部源方法調用。
不知道如何...到什麼? – 2011-12-17 19:34:57
我不知道如何...幫助 – 2011-12-17 19:38:13
上面的代碼顯示使用了一個實例變量,而不是一個類變量。 – 2011-12-17 20:03:59