2013-06-04 3 views
2

Я попытался реализовать макет в своих модульных тестах, но он никогда не вызывается, хотя он и должен.Mock никогда не назывался

tests.py

from mock import patch 

class MyTest(TestCase): 
    def test_add(self): 
     name = 'Test' 

     with patch('my_module.my_file.my_function') as add_method: 
      m = MyModel(name=name) 
      m.save() 

     add_method.assert_called_with(name=name) 

models.py

from my_module.my_file import my_function 

class MyModel(Model): 
    name = CharField(max_length=12) 

    def save(self, *args, **kwargs): 
     my_function(self.name) 

     super(MyModel, self).save(*args, **kwargs) 

my_file.py

def my_function(name): 
    # Processing... 

Когда я запускаю тест блока, он просто говорит мне, что макет не было хотя, должно быть, я знаю, что скрипт работает нормально. У вас есть идеи/советы для меня?

ответ

1

Когда импортировано models, оно проходит from my_module.my_file import my_function, что еще не издевается. Когда вы запускаете тестовый пример, имя my_function в модуле models уже привязано к функции real: исправление my_files не влияет.

Что вам нужно пропатчить models.my_function:

with patch('models.my_function') as add_method: 
    m = MyModel(name=name) 
    m.save() 

Альтернативой было бы залатать my_file.my_function в models время импорта.

См. where to patch документация.

+0

Спасибо, он отлично работает! –

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