【发布时间】:2021-02-11 12:22:44
【问题描述】:
我正在使用 pytest 开发测试,但遇到 AttributeError: can't set attribute。
这是模型:
class User(UserMixin, db.Entity):
_table_ = 'users'
email = Required(str, unique=True)
username = Required(str, unique=True)
password_hash = Optional(str)
pretax_income = Optional(Decimal, default=110000)
tax_rate = Optional(Decimal, default=0.1)
@property
@db_session
def monthly_income(self):
return round(self.pretax_income/12, 2)
@property
@db_session
def post_tax_income(self):
return round(self.pretax_income - (self.pretax_income * self.tax_rate), 2)
@property
@db_session
def post_tax_income_monthly(self):
return round(self.post_tax_income / 12, 2)
这就是我做测试的地方,前两个工作正常。最后一个测试每月税后收入得到关于设置属性的错误。
class TestCalculator:
@db_session
def test_calc_monthly_income(self):
user = User.get(email='test@test.com')
user.pretax_income = 12000
assert user.monthly_income == Decimal('1000')
user.pretax_income = 48000
assert user.monthly_income== Decimal('4000')
@db_session
def test_calc_post_tax_income(self):
user = User.get(email='test@test.com')
user.pretax_income = 120000
user.tax_rate = 0.1
assert user.post_tax_income == 108000
user.pretax_income = 90000
user.tax_rate = 0.2
assert user.post_tax_income == 72000
@db_session
def test_calc_post_tax_income_monthly(self):
user = User.get(email='test@test.com')
user.post_tax_income = 36000
assert user.post_tax_income_monthly == Decimal('3000')
user.post_tax_income = 60000
assert user.post_tax_income_monthly == Decimal('5000')
更新:我尝试以这种方式添加 setter。很明显,我做错了。
@post_tax_income.setter
@db_session
def set_post_tax_income(self):
self.post_tax_income = post_tax_income
【问题讨论】:
-
您已将
post_tax_income定义为具有getter 而没有setter 的属性。所以只能获取,不能设置。