2014-07-14 56 views
0

我想模擬一個方法來在我的一個模擬類中返回一個測試值。我遇到的問題是返回測試值,模擬方法返回MagicMock類型的對象。嘲笑python中類對象方法的返回

該代碼是非常人爲的,但說明了這個問題。

SUT(sut.py):

provider = None 


class Provider(): 
    def get_data(self): 
     return 'production data' 


def get_provider(): 
    return Provider() 


def setup_provider(): 
    global provider 
    provider = get_provider() 


def do_worker(): 
    return provider.get_data() 

測試(mocking.py):

sut.get_provider = MagicMock(name='get_provider').return_value = provider_mock 

那項任務結合:

import unittest 
from mock import MagicMock 
import sut 


class TestWorker(unittest.TestCase): 
    def test_worker(self): 
     provider_mock = MagicMock() 
     provider_mock.get_data.return_value = 'test data' 

     sut.get_provider = MagicMock(name='get_provider').return_value = provider_mock 

     sut.setup_provider() 

     data = sut.do_worker() 

     # data comes back as type MagicMock 
     assert data == 'test data' 

回答

1

你被你的鏈接分配混淆provider_mocksut.get_providerMagicMock(name='get_provider').return_value

換句話說,它本質上是做這樣的:

sut.get_provider = provider_mock 
MagicMock(name='get_provider').return_value = provider_mock 

這不是你想要的。現在sut.get_provider調用provider_mock並返回一個新的MagicMock對象,而不是原始provider_mock對象。

獨立的任務:

sut.get_provider = MagicMock(name='get_provider') 
sut.get_provider.return_value = provider_mock 
+0

十分感謝 - 您的權利我得到一對夫婦線交叉的 - 我已經用C#和Java嘲諷框架花費了大量的時間 - 仍然得到我的腦海裏圍繞蟒蛇纏繞。 – IUnknown