Python 如何使我的基本员工类能够动态计算年龄

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

我已经创建了一个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,今天.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
,然后我非常确定我的答案和我对您问题的评论是在上,您的答案是正确的:-)