Python 如何使我的基本员工类能够动态计算年龄
我已经创建了一个employee基类Python 如何使我的基本员工类能够动态计算年龄,python,unit-testing,Python,Unit Testing,我已经创建了一个employee基类 class Employee(): description=“普通员工” def_uuuinit_uuuu(自我,员工id:int,姓名:str,姓氏:str,dob:str): self.employee\u id:int=employee\u id self.name=名称 self.姓氏=姓氏 self.dob=解析(dob) 自身年龄 @财产 年龄(自我): 今天=日期。今天() 年龄=今天.year-self.dob.year-((今天.month
class Employee():
description=“普通员工”
def_uuuinit_uuuu(自我,员工id:int,姓名:str,姓氏:str,dob:str):
self.employee\u id:int=employee\u id
self.name=名称
self.姓氏=姓氏
self.dob=解析(dob)
自身年龄
@财产
年龄(自我):
今天=日期。今天()
年龄=今天.year-self.dob.year-((今天.month,今天.day)<(self.dob.month,self.dob.day))
回归年龄
我在employee
类上运行了单元测试,但下面的测试代码失败了
def employee():
返回员工(1001,‘约翰’、‘史密斯’、‘1975-08-25’)
...
类TestEmployee(TestCase):
def测试年龄(自我):
年龄=员工年龄('1975-08-25')
断言年龄==44
试验结果如下:
> age = employee.age('1975-08-25')
E AttributeError: 'function' object has no attribute 'age'
您无法从字符串访问年、月和日函数,您需要传递日期对象或将字符串日期转换为日期对象 emp_dob=datetime.datetime.strtime('1975-08-25',%Y-%m-%d”).date()
然后您可以访问emp_dob.year您的
@属性
年龄
不应获取任何参数。您现在正在将稍后在employee.dob
中期望的值作为参数提供
正确的测试将是
def test_age(self):
e = employee()
age = e.age
assert age == 44
但是,这带来了一个问题,即年龄是相对于now()
计算的,因此该测试每年至少中断一次
通过动态计算出生日期,您可以做得更好-这也使您能够测试,例如,在生日的前一天、后一天或正好在生日时,财产将返回什么:
from datetime import datetime, timedelta
def test_age(self):
yesterday = datetime.now() - timedelta(days=1)
employee = Employee(42, "Name" "Surname",'{year}-{month}-{day}'.format(year=yesterday.year - 44), month=yesterday.month, day=yesterday.day)
age = employee.age
assert age == 44
employee
是如何定义的?def employee():在这种情况下返回employee(1001,'John','Smith','1975-08-25')
。您只需从调用中删除dob(和()
,然后直接断言employee.age==44
。不过,这种方法还存在其他问题(请参见下面的答案)调整了下面的示例测试,以符合您对employee()的定义
-仍然有一个强烈的暗示,硬编码的出生日期最长会持续一年,然后会中断。重要的一点是重新硬编码的dobTrusting,parse()\uuuu init\uuuuu
中调用的方法实际上已经实现,我更希望传递给age
的dob字符串是问题所在……在构造函数中使用from dateutil.parser import parse
将dob
字符串转换为datetime
,然后我非常确定我的答案和我对您问题的评论是在上,您的答案是正确的:-)