小编Ste*_*ven的帖子

Python:Factory Boy 生成对象创建时指定长度的列表

我正在尝试使用 Factoryboy 在创建时指定长度的对象中创建一个列表。

我可以创建列表,但是由于提供的长度/大小的惰性性质,每次尝试创建具有指定长度的列表都会导致问题。

这是我到目前为止所拥有的:

class FooFactory(factory.Factory):

    class Meta:
        model = command.Foo

    foo_uuid = factory.Faker("uuid4")
    bars = factory.List([
        factory.LazyAttribute(lambda o: BarFactory()
        for _ in range(3))
    ])
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含 3 个随机条的列表。我尝试过使用 Params 和排除的组合,但由于 range 需要一个 Int,并且 int 直到稍后才会延迟加载,因此会导致错误。

我想要类似于如何使用 post_ Generation 生成一对多关系的东西,即。

foo = FooFactory(number_of_bars=5)
Run Code Online (Sandbox Code Playgroud)

有人有这样的运气吗?

python unit-testing factory-boy

7
推荐指数
1
解决办法
2492
查看次数

在事件溯源中命名事件类型的最佳实践

在构建事件存储时,典型的方法是序列化事件,然后持久化事件类型、事件主体(序列化事件本身)、标识符和发生时间。

关于事件类型,是否有关于如何存储和引用这些事件的最佳实践?我看到的示例存储类的完全限定路径,即。

com.company.project.package.XXXXEvent
Run Code Online (Sandbox Code Playgroud)

如果您决定重构您的项目结构,那么需要什么努力?

domain-driven-design event-sourcing domain-events

4
推荐指数
1
解决办法
682
查看次数

Python 数据类:模拟冻结数据类中的默认工厂

我试图在我的单元测试中使用 freezegun 来修补数据类中的字段,该字段设置为对象初始化时的当前日期。我想这个问题与任何修补被用作 default_factory 的函数的尝试有关,只是在 freezegun 之外。数据类被冻结,所以它是不可变的。

例如,如果我的数据类是:

@dataclass(frozen=True)
class MyClass:
    name: str
    timestamp: datetime.datetime = field(init=False, default_factory=datetime.datetime.now)
Run Code Online (Sandbox Code Playgroud)

当我使用 freezegun 修补 datetime 时,它​​对 MyClass 中时间戳的初始化没有影响(它仍然将时间戳设置为单元测试中 now() 返回的当前日期,导致测试失败)。

我假设它与在补丁到位之前加载的默认工厂和模块有关。我尝试修补日期时间,然后使用 importlib.reload 重新加载模块,但没有运气。

我目前的解决方案是:

@dataclass(frozen=True)
class MyClass:
    name: str
    timestamp: datetime.datetime = field(init=False)

def __post_init__(self):
   object.__setattr__(self, "timestamp", datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)

哪个有效。

理想情况下,我想要一个非侵入性的解决方案,它不需要我更改我的生产代码来启用我的单元测试。

python unit-testing patch freezegun python-dataclasses

3
推荐指数
1
解决办法
2172
查看次数

DDD集合:在另一个集合中持有非根实体标识符的实体

我正在尝试了解实体和集合之间的关系的最佳实践。

设想一个设计,其中有一个由两个实体组成的Product Aggregate

总根:产品

子实体:Sku

那里的产品可以有很多Skus。Skus和产品的零件号和名称是不变的,因为更改其中一个的名称必须以事务方式确保另一个已更新。同样,产品集合需要确保绝不存在重复的Skus。

我们还有另一个聚合:StorageLocation。存储1个或更多Skus的位置。但是,重要的是,StorageLocation知道要存储的特定Sku。即。在加拿大的StorageLocation应该存储该国本地的Sku,而不是用于美国市场的Sku。

在我看来,这意味着StorageLocation需要保留对Sku的引用(因为对产品汇总根的引用本身并未提供足够的信息来确定要存储的Sku)。

根据我的阅读,这似乎打破了另一个聚合对象不应持有对另一个聚合对象中非根实体的引用的原则。所以问题:

  • 在存储位置汇总中仅保留产品和Sku的标识符是可以接受的吗?
  • 我知道瞬态引用被认为是允许的,但在这种情况下(至少据我所知),此信息需要存储。如上所述,仅存储对Product(或ProductId)的引用是不够的。
  • 产品和Skus具有自然标识符(零件号,Sku号)。这是否为将这些值存储在StorageLocation聚合中提供了更大的灵活性,因为它们的含义超出了技术含义。
  • 我是用错误的方式来处理这个问题,需要以不同的方式看待事情。我经常发现很难突破PK / FK的心态。

谢谢

entity domain-driven-design aggregate

2
推荐指数
2
解决办法
376
查看次数