2016-01-22 2 views
2

Я пишу тестовые примеры, используя библиотеку python mock.Python mock patch не реселлирует возвращаемое значение

class AddressByPhoneTestCase(TestCase): 
    def test_no_content_found_with_mock(self): 
     print "this function will mock Contact model get_by_phone to return none" 
     with mock.patch('user_directory.models.Contact') as fake_contact: 
      print "fake_contact_id ", id(fake_contact) 
      conf = { 'get_by_phone.return_value': None } 
      fake_contact.configure_mock(**conf) 
      resp = self.client.get(reverse('get_address_by_phone'), {'phone_no' : 1234567891}) 
      self.assertTrue(resp.status_code == 204) 

    def test_success_with_mock(self): 
     print "this function will test the address by phone view after mocking model" 
     with mock.patch('user_directory.models.Contact') as fake_contact: 
      print "fake_contact_id ", id(fake_contact) 
      contact_obj = Contact(recent_address_id = 123, best_address_id = 456) 
      conf = { 'get_by_phone.return_value': contact_obj } 
      fake_contact.configure_mock(**conf) 
      resp = self.client.get(reverse('get_address_by_phone'), {'phone_no' : 1234567891}) 
      resp_body = json.loads(resp.content) 
      self.assertTrue(resp_body == { 'recent_address_id' : 123, 
              'frequent_address_id' : 456 
             } 
         ) 

Во втором случае Contact.get_by_phone не все еще возвращающимся None, даже если я изменил его, чтобы вернуть contact_obj, когда я снял верхнюю часть корпуса теста, этот тест случаев проходит, но терпит неудачу иначе ссылаясь на верхнюю причину кто-то помочь , как я могу сделать python mock patch для сброса значения.

ответ

1

Не знаю, какая причина для этого, но вам кажется, что вам нужно импортировать родительский элемент тестируемой функции/класса.

я написал эту строку в моем views.py

from user_directory.models import Contact 

Контакт был не зависит от mock.patch. См. Пример here. Поэтому я изменил свой код на следующий, и он работал как шарм.

def test_no_content_found_with_patch(self): 
    print "this function will mock Contact model get_by_phone to return none" 
    with mock.patch('user_directory.models.Contact.get_by_phone') as fake_func: 
     fake_func.return_value = None 
     resp = self.client.get(self.get_address_by_phone, {'phone_no' : 1234567891}) 
     self.assertTrue(resp.status_code == 204) 

def test_success_with_patch(self): 
    print "this function will test the address by phone view after mocking model" 
    with mock.patch('user_directory.models.Contact.get_by_phone') as fake_func: 
     contact_obj = Contact(recent_address_id = 123, best_address_id = 457) 
     fake_func.return_value = contact_obj 
     resp = self.client.get(self.get_address_by_phone, {'phone_no' : 1234567891}) 
     resp_body = json.loads(resp.content) 
     self.assertTrue(resp_body == { 'recent_address_id' : contact_obj.recent_address_id, 
             'frequent_address_id' : 457 
            } 
        ) 

Смотрите эту строку

with mock.patch('user_directory.models.Contact.get_by_phone') as fake_func 
+0

Это должно работать нормально, но оригинальный пост должен работать. Пожалуйста, уточните, когда вы можете сделать свой оригинальный пост, как есть, спасибо – Gang

+0

@Gang Нет выше не работает. Выше будет работать, если в моих представлениях я сделаю это из моделей импорта user_directory. и используйте модели .Контакт вместо контакта –

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