我正在使用Factory Boy为测试创建夹具和对象。
我在两个对象之间有一个关系,但是我是基于身份引用而不是直接的对象引用来维持这种关系。
我使用SQLAlchemy作为ORM,尽管我认为不管使用ORM技术,情况都是一样的。由于子对象与父对象具有外键关系,因此父对象必须存在,否则,如果使用创建策略,它将产生外键冲突。我有以下解决方案,但是我很感兴趣是否有人采用了更优雅的方法。
使用人为设计的员工和公司示例,其中员工只能在一个公司工作。
class Company:
self.company_id: uuid
self.name: str
class Employee:
self.employee_id: uuid
self.company_id: uuid
self.fullname: str
其中Employee中的company_id是与公司的外键关系。员工工厂如下所示(创建公司,然后从创建的公司对象中分配company_id)。
class EmployeeFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = entity.Employee
exclude = ["company"]
company = factory.SubFactory(CompanyFactory)
employee_id = factory.SubFactory(EmployeeIdFactory)
company_id = factory.SelfAttribute("company.company_id")
name = factory.Faker("sentence",nb_words=2)
我唯一不满意的部分是,如果要在使用工厂时指定/覆盖company_id,则需要使用以下调用:
EmployeeFactory.create(company__company_id=company_id)
我可以对此进行记录,但是另一位开发人员会假设他们可以使用典型的方法:
EmployeeFactory.create(company_id=company_id)
打电话。
有人知道实现这一目标的方法吗?
另一种选择是在Test本身中,首先创建Company,然后将company_id传递给EmployeeFactory。