2015-08-05 3 views
0
class Employee: 
    address = models.ForeignKey(Address) 

    def setZipCode(self, zipcode): 
     setattr(self, 'zipCode', zipcode) 

    def set_address_property(self, target_property, value): 
     try: 
      setattr(self.address, target_property, value) 
      self.address.save() 
     except ObjectDoesNotExist: 
      # TODO. Figure out what to do here 
      print 'Cannot save' 
      return 
    def get_address_property(self, target_property, default): 
     try: 
       return getattr(self.address, target_property) 
     except ObjectDoesNotExist: 
      return default 

@property 
def zipCode(self): 
    return self.get_address_property('zipCode', None) 

@zipCode.setter 
def zipCode(self, value): 
    self.set_address_property('zipCode', value) 

def functionToTest(employee): 
    # Blah Blah Blah... 
    employee.setZipCode(123) 

def testFunctionToTest(self): 
    employee = MagicMock() 
    employee.address.zipCode = None 
    employee.attribute.setZipCode = lambda x, y: setattr(x.address, 'zipCode', y) 
    functionToTest(employee) 
    self.assertEquals(employee.address.zipCode, 123) 

Если я попытаюсь запустить этот тест, я все равно получаю employee.address.zipCode как None вместо 123. Как я могу исправить эту проблему?Как издеваться над функцией объекта, которая записывает один и тот же объект в python?

Я отредактировал код, чтобы на самом деле отразить мою оригинальную логику. Спасибо за помощь.

+0

В чем смысл 'setZipCode' вообще? Если у вас должен быть метод, почему вы используете 'setattr', а не просто присваиваете значение' self.address.zipCode'? –

+0

Позвольте мне отредактировать функцию setZipCode. – user1159517

ответ

3

Вам не нужно проверять, действительно ли атрибут установлен; Ваш тест должен охватывать только если метод вызывается на всех:

employee = MagicMock(spec= Employee) 
functionToTest(employee) 
employee.assert_called_once_with(123) 

Тестирование если employee.setZipCode() работает правильно является предмет модульного тестирования Employee класса, и выходит за рамки для тестирования функции fuctionToTest().

+0

Это имеет смысл. Но я хочу проверить, что это свойство также установлено правильно или нет. – user1159517

+0

@ user1159517: опять же, это тестирование, если «Сотрудник» правильно реализован. Вы не тестируете «Сотрудник» здесь, вы тестируете 'functionToTest'. Эта функция * не нуждается в заботе *, если «Сотрудник» правильно реализован или нет. Просто нужно верить, что это так. –

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