2016-11-10 4 views
1

Я не уверен, что я делаю неправильно. Возможно, у меня неправильный конец палки с насмешкой. Но мое предположение заключалось в том, что когда вы используете mocks, он в основном делает какую-то магию и заменяет объекты в вашем исходном коде.Замена объекта с помощью mocks

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 макет, а глупый мощный, безусловно, не очень удобный в использовании.

Печатное утверждение показывает, что вы правильно заплат my_module.Sites но вы не зарегистрировали get_sites возвращаемое значение правильно, и это должно быть:

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

Оператор печати показывает, что существует призыв к 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() 

Mock гораздо счастливее, когда вы используете:

from mylib.sites import Sites 
sm = Sites() 

Это наряду с ответом dm03514 помог мне получить работу

Смежные вопросы