2015-09-08 2 views
1

Я хочу издеваться над одним из методов модели в своих тестах. Это моя модель с помощью метода я хочу издеватьсяНе могу издеваться над методом модели в тестах Django

class Customer(models.Model): 
    # Fields ... 

    def save(self, *args, **kwargs): 

     update_collector = self.id is None 

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

     if update_collector: 
      self.send_to_address_book() 

    def send_to_address_book(self): # This is the method I want mocked 
     email = self.user.email 
     first_name = self.user.first_name 
     last_name = self.user.last_name 
     print("This is not being mocked") 

     investigate_customer.apply_async(
      args=[first_name, last_name, email] 
     ) 

Тогда, я хочу, чтобы все тесты, которые наследуют от CustomerTestCase издеваться send_to_address_book

class CustomerTestCase(object): 
    @mock.patch('accounts.models.Customer.send_to_address_book') 
    def create_user_and_customer(self, name, mock_method): 
     mock_method.return_value = None 
     if not name: 
      name = 'test' 
     email = name + '@test.si' 
     user = User.objects.create_user(name, email) 
     customer = Customer.objects.create(user=user) 
     return user, customer 

Однако, когда я бегу следующие тесты, send_to_address_book является не издевались.

class CustomerQueriesTest(CustomerTestCase, TestCase): 
    def setUp(self): 
     G(Language, code='en', name='English') 
     self.user, self.customer = self.create_user_and_customer() 

    def test_queries_running(self): 
     profile = self.user.profile 
     resp = self.user.profile.queries_running() 
     self.assertEqual(resp, 0) 
     G(Package) # using Django dynamic fixtures to create a new Package 

Что мне не хватает?

+1

Возможно, это даст вам подсказку: https://docs.python.org/3/library/unittest.mock .html #, где к пластырь – diegueus9

ответ

0

Итак, я нашел, в чем проблема.

Отчасти это была проблема настроек по умолчанию DDF. Если поле модели пуст/пусто, оно по-прежнему будет заполнять его по умолчанию. Поэтому, когда с DDF был создан Package, он также создал Customer из-за FK.

Вторая часть проблемы была, что Package находится в другом модуле, чем Customer так @mock.patch('accounts.models.Customer.send_to_address_book') сделал ничего (см Python docs для более подробной информации). Я должен был добавить второй патч, который позаботился о том, когда Customer был создан через Package:

@mock.patch('billing.models.Customer.send_to_address_book')