2016-11-10 75 views
1

我不知道我在做什麼錯。也許我有嘲弄的棍棒的錯誤結局。但我的假設是,當你使用模擬它基本上會做一些魔術,並替換原始代碼中的對象。用嘲笑代替物體

sites.py

class Sites: 
    def __init__(self): 
     pass 

    def get_sites(self): 
     return ['washington', 'new york'] 

my_module.py

from mylib import sites 

def get_messages(): 
    # get Sites 
    sm = sites.Sites() 
    sites = sm.get_sites() 
    print('Sites:' , sites) 

    for site in sites: 
     print('Test: ' , site) 

my_test.py

import my_module 
import unittest 
from unittest.mock import patch 


class MyModuleTestCase(unittest.TestCase): 

    @patch('my_module.Sites') 
    def test_process_the_queue(self, mock_sites): 
     mock_sites.get_sites.return_value = ['london', 'york'] 

     print(mock_sites.get_sites()) 
     my_module.get_messages() 

if __name__ == '__main__': 
    unittest.main() 

運行此我得到以下輸出:

.['london', 'york'] 
Sites: <MagicMock name='Sites().get_sites()' id='139788231189504'> 

---------------------------------------------------------------------- 
Ran 1 test in 0.002s 

OK 
[Finished in 0.1s] 

我期待第二次打印輸出(發生在my_module.py中)與第一次打印輸出相同,並通過作爲返回值傳遞的列表進行循環。

任何幫助將不勝感激。

更新 爲了證明我是怎麼最初導入我的課

回答

1

Python的模擬,而愚蠢的強大,是絕對不會使用起來非常直觀。

print語句表明你正確修補my_module.Sites但你沒有正確註冊get_sites返回值,它應該是:

mock_sites.return_value.get_sites.return_value = ['london', 'york']

print語句表明,有一個呼叫Sites().get_sites()註冊您的修補對象:

Sites: <MagicMock name='Sites().get_sites()' id='139788231189504'>

當閱讀本我發現它的幫助翻譯()return_value

Sites.return_value.get_sites.return_value

你缺少的返回值代表模擬站點的實例化對象:Sites()

+0

煩人這項功能對我做了演示,但不適合我實際代碼>。< –

+0

Woohoo。得到它的工作!謝謝你指引我朝着正確的方向前進。 –

0

我遇到的問題是我正在導入並調用我的外部類的方式。

from mylib import sites 
sm = sites.Sites() 

模擬是更快樂,當你使用:

from mylib.sites import Sites 
sm = Sites() 

這連同dm03514的回答讓我得到它的工作