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

如何模拟对象';在python中写入同一对象的函数?,python,unit-testing,mocking,python-unittest,Python,Unit Testing,Mocking,Python Unittest,如果我尝试运行这个测试,我仍然会得到employee.address.zipCode作为None而不是123。如何解决此问题 不需要测试属性是否已实际设置;您的测试应仅涵盖调用该方法的情况: class Employee: address = models.ForeignKey(Address) def setZipCode(self, zipcode): setattr(self, 'zipCode', zipcode) def set_address

如果我尝试运行这个测试,我仍然会得到
employee.address.zipCode
作为
None
而不是123。如何解决此问题

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

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.setZipCode()
是否正确工作是对
employee
类进行单元测试的主题,并且超出了测试
fuctionToTest()
函数的范围。

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

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.setZipCode()
是否正确工作是对
employee
类进行单元测试的主题,并且超出了测试
fuctionToTest()
函数的范围。

setZipCode的意义何在?如果您必须有一个方法,为什么要使用
setattr
而不仅仅是将值赋给
self.address.zipCode
?让我编辑setZipCode函数。
setZipCode
有什么意义?如果必须有一个方法,为什么要使用
setattr
而不是将值赋给
self.address.zipCode
?让我编辑setZipCode函数。这很有意义。但是我想验证这个属性是否设置正确。@user1159517:同样,这是在测试
Employee
是否正确实现。您不是在测试
员工
,而是在测试
功能测试
。该功能不需要关心员工是否正确执行了
Employee
。它只需要相信它是真的,这是有道理的。但是我想验证这个属性是否设置正确。@user1159517:同样,这是在测试
Employee
是否正确实现。您不是在测试
员工
,而是在测试
功能测试
。该功能不需要关心员工是否正确执行了
Employee
。它只需要相信它是。