我正在尝试使用 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)
有人有这样的运气吗?
在构建事件存储时,典型的方法是序列化事件,然后持久化事件类型、事件主体(序列化事件本身)、标识符和发生时间。
关于事件类型,是否有关于如何存储和引用这些事件的最佳实践?我看到的示例存储类的完全限定路径,即。
com.company.project.package.XXXXEvent
Run Code Online (Sandbox Code Playgroud)
如果您决定重构您的项目结构,那么需要什么努力?
我试图在我的单元测试中使用 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)
哪个有效。
理想情况下,我想要一个非侵入性的解决方案,它不需要我更改我的生产代码来启用我的单元测试。
我正在尝试了解实体和集合之间的关系的最佳实践。
设想一个设计,其中有一个由两个实体组成的Product Aggregate:
总根:产品
子实体:Sku
那里的产品可以有很多Skus。Skus和产品的零件号和名称是不变的,因为更改其中一个的名称必须以事务方式确保另一个已更新。同样,产品集合需要确保绝不存在重复的Skus。
我们还有另一个聚合:StorageLocation。存储1个或更多Skus的位置。但是,重要的是,StorageLocation知道要存储的特定Sku。即。在加拿大的StorageLocation应该存储该国本地的Sku,而不是用于美国市场的Sku。
在我看来,这意味着StorageLocation需要保留对Sku的引用(因为对产品汇总根的引用本身并未提供足够的信息来确定要存储的Sku)。
根据我的阅读,这似乎打破了另一个聚合对象不应持有对另一个聚合对象中非根实体的引用的原则。所以问题:
谢谢