如何模拟写入 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()
功能的范围内。
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()
功能的范围内。