2011-12-17 56 views
3

說我有一個類:如何在python單元測試中模擬類變量值?

class A(): 
    def f(self): 
    self._v = 1 

嘗試:

m=Mocker() 
A.f._v = m.mock() 
... 

,但沒有奏效。不知道如何......

+2

不知道如何...到什麼? – 2011-12-17 19:34:57

+1

我不知道如何...幫助 – 2011-12-17 19:38:13

+0

上面的代碼顯示使用了一個實例變量,而不是一個類變量。 – 2011-12-17 20:03:59

回答

4

你的意思是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'> 
4

類定義顯示了一個實例變量,從這個類的外部設置它,做這樣的事情:

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() 
0

我嘗試了上述解決方案,它仍然沒有解決我的目的,這正是最初問。上面的方法會更新我的類的模擬屬性以獲得值。

我的要求是從我在單元測試類中提供的模擬值中設置屬性值。

我終於可以通過以下方法解決這個問題了。讓我知道,如果它不是一個正確的方法:

實際類:

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與模擬值進行模擬,您可以使用模擬值測試該方法,而無需擔心外部源方法調用。