2013-05-01 3 views
7

Я использую nosetests и в двух отдельных файлах у меня есть два теста. Оба работают нормально, когда запускаются индивидуально, но при запуске вместе, макет из первого теста испортил результаты во втором тесте. Как я могу гарантировать, что все издевательства/исправления будут сброшены после завершения тестовой функции, чтобы я получил чистый тест при каждом запуске?Python - Как разблокировать/сбросить макет во время тестирования?

Если возможно, объяснение с помощью моих тестов было бы особенно ценным. Мой первый тест выглядит следующим образом:

def test_list_all_channel(self): 
    from notification.models import Channel, list_all_channel_names 
    channel1 = Mock(); 
    channel2 = Mock(); 
    channel3 = Mock(); 
    channel1.name = "ch1" 
    channel2.name = "ch2" 
    channel3.name = "ch3" 
    channel_list = [channel1, channel2, channel3] 
    Channel.all = MagicMock() 
    Channel.all.return_value = channel_list 
    print Channel 
    channel_name_list = list_all_channel_names() 
    self.assertEqual("ch1", channel_name_list[0]) 
    self.assertEqual("ch2", channel_name_list[1]) 
    self.assertEqual("ch3", channel_name_list[2]) 

И мой второй тест:

def test_can_list_all_channels(self): 
    add_channel_with_name("channel1") 
    namelist = list_all_channel_names() 
    self.assertEqual("channel1", namelist[0]) 

Но возвращаемое значение из Channel.all() по-прежнему установлен в списке из первой функции таким образом я получаю ` «ch1» не равен «channel1». Какие-либо предложения? Спасибо много!

ответ

10

Посмотрите http://www.voidspace.org.uk/python/mock/patch.html

В начале теста вы начать свой патч и запустить

p = patch("Channel.all", new=MagicMock(return_value=channel_list)) 
p.start() 

В конце:

p.stop() 

Это гарантирует, что ваши издевается изолированы на тест.

+0

Что касается функций Mock за пределами патча? Единственный способ сделать это - исправить их для начала? – golmschenk

+0

Да. Я бы рекомендовал использовать встроенную инфраструктуру unittest. Таким образом, вы можете создавать методы setUp и tearDown для создания/уничтожения ваших патчей. –

+0

привет @ jjia6395, кажется, скобки отсутствуют или слишком много? –