CQRS 系统中的单元测试域模型属性

Unit Testing Domain Models attributes in CQRS System

我正在寻求其他人对特定场景的想法:在使用 CQRS 的应用程序中对域模型(实体、VO 等)属性进行单元测试。

想象一个带有产品名称 (VO) 的产品(实体)的简化示例。

class Product
private ProductName productName

产品有一些基本保护 rails 和不变量:

我可以对产品实体和产品名称 VO 进行单元测试,以通过确保引发正确的错误和异常来确保正确执行这些操作。简单。

我的问题是关于单元测试的快乐路径——在产品最初开发时成功设置产品名称。

在非 CQRS 系统中,我会在产品名称上有一个 public 只读 属性 或 getter,以便可以检索它以进行报告、显示或填充 DTO。然后我可以用这个 属性.

进行单元测试

虽然在 CQRS 系统中,产品名称在实体中可以是私有的,因为产品名称的检索是通过查询端的读取模型进行的。在开发产品时通过命令设置产品名称,但此后任何核心业务操作都不需要产品名称(除了我可以想象重命名产品)。

为了对产品的成功创建进行单元测试,虽然我需要将产品名称设置为只读 public 属性 来测试它,但这样做似乎不对只是为了完成单元测试。如果没有单元测试,Product Name 可以保持私有,一切都会按需运行。

想知道是否有人遇到过类似的单元测试场景 -> 其中一个属性主要用于演示目的(虽然显然非常重要......我不希望用户仅通过尝试使用产品部件号或标识符)正在测试中?

我倾向于通过阅读模型来测试它? IE。创建 Product ,然后确定名称已通过读取模型成功设置。但这对于单元测试来说似乎很多。

To unit test the successful creation of a product though I need to make the Product Name a read-only public property to test it, but it doesn't seem right to do this just to fulfil a unit test. Without the unit test the Product Name can remain private and everything would work as needed.

数据如何从您的域模型获取到您的持久存储?数据如何从您的 "write" 模型传输到您的 "read" 模型?

在你的代码库的某个地方,你有一个函数,它接受一个 Product 作为输入和 returns 它的一些域不可知的表示(byte[],或 JSON ,或其他),或者您有一个方法将 Product 和一个接受某些域不可知表示的回调作为参数。

它可能是显式的,也可能是隐式的(ORM 魔法?),但它会出现在某个地方 -- "write only" 域实体不是很有趣。

您的测试应该使用相同的机制。

记住 "unit test" 中对 "unit" 的旧理解之一可能会有所帮助——即 test 是一个孤立的自包含东西,不受其他测试的干扰,这些测试也可能是 运行.