2015-07-02 2 views
1

Я пытаюсь использовать monkeypatch, чтобы высмеять одну публичную функцию, но, похоже, она не работает для меня.Python monkeypatch не исправляет функцию правильно

Вот моя структура

myproject 
    |-mrss 
    |- feed_burner.py <- has get_feed() 
    |- version_controller.py <- has get_version() 
    |-tests 
    |-feed_burner_tests.py 

файл Вот мой тест

from mrss.feed_burner import get_feed 
from _pytest.monkeypatch import monkeypatch 


def test_first_feed(self): 
     mp = monkeypatch() 
     mp.setattr(mrss.version_controller, 'get_version', lambda env: 7) 
     mrss_feed = get_feed(env=get_config()) 
     root = ET.fromstring(mrss_feed) 

     self.assertEquals(21, len(programmes)) 

И это моя get_feed функция

from mrss.version_controller import get_version 

def get_feed(env=os.environ): 
    uploader = Uploader(env=env) 
    folder = env.get('S3_FOLDER') 

    version = get_version(env) 
    print version.isdigit() 
    print 'version is {v}'.format(v=str(version)) 
    if not version or not version.isdigit(): 
     return '' 

И все, что я получил за get_version пустая строка

False 
version is 

Я пытался с этим, но не повезло

with patch('mrss.feed_burner.get_feed.mrss.version_controller.get_version', new=lambda env: 7): 
    mrss_feed = get_feed(env=get_config()) 
    root = ET.fromstring(mrss_feed) 

    programmes = root.findall('programme') 

    self.assertEquals(21, len(programmes)) 
+0

Является ли тест в том же файле, что и определение 'get_feed'? – chepner

+0

Нет. Они не находятся в одном файле. Я обновлю свой полный тест – toy

+0

Возможно, вы исправляете неправильную функцию. Если 'get_feed' находится в файле' mycode.py', вам нужно исправить 'mycode.mrss.versioncontroller', а не' mrss.versioncontroller', импортированный в ваш тестовый модуль. Модуль 'mock' описывает [что исправлять] (http://mock.readthedocs.org/en/latest/patch.html#where-to-patch), и я подозреваю, что вы испытываете ту же проблему (и решение это то же самое, хотя я не уверен, что на самом деле опубликую ответ). – chepner

ответ

2

В тестовой функции

from mrss.feed_burner import get_feed 
from _pytest.monkeypatch import monkeypatch 


def test_first_feed(self): 
    mp = monkeypatch() 
    mp.setattr(mrss.version_controller, 'get_version', lambda env: 7) 
    mrss_feed = get_feed(env=get_config()) 
    root = ET.fromstring(mrss_feed) 

    self.assertEquals(21, len(programmes)) 

функция объект ссылается get_feed не вызывает mrss.version_controller.get_version, который ссылка используется тест модуль. Это действительно звонки mrss.feed_burner.mrss.version_controller.get_version, вот что вам нужно для патча обезьяны. (get_feed имеет свою ссылку на область своего модуля, которая отличается от ссылки в тестовом модуле.)

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