如何模拟写入 python 中同一对象的对象函数?

How to mock an object's function which writes to the same object in python?

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。我该如何解决这个问题?

您不需要测试该属性是否实际设置;您的测试应该只涵盖是否调用了该方法:

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

测试 employee.setZipCode() 是否正常工作是 Employee class 单元测试的主题,并且不在测试 fuctionToTest() 功能的范围内。