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



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

想象一个产品(实体)的简化示例,其中包含一个产品名称(VO)。

class Product
private ProductName productName

产品有一些基本的护栏和不变量:

  • 产品名称不能超过100个字符(在VO中强制执行)
  • 产品必须具有产品名称(在实体中强制执行,在构造函数中设置产品名称以确保其始终有效)

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

我的问题是关于单元测试的快乐之路——当一个产品最初被开发时,产品名称被成功设置。

在非CQRS系统中,我会在产品名称上有一个公共只读属性或getter,这样就可以检索它来报告、显示或填充DTO。然后我可以用这个属性进行单元测试。

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

为了对产品的成功创建进行单元测试,尽管我需要将产品名称设置为只读公共属性来测试它,但仅仅为了完成单元测试似乎是不对的。如果没有单元测试,产品名称可以保持私有,一切都可以根据需要工作。

想知道是否有人遇到过类似的单元测试场景->主要用于演示目的的属性(尽管显然非常重要……我不希望用户仅通过零件号或标识符尝试使用产品)在哪里进行测试?

我倾向于通过阅读模型来测试这一点?即创建产品,然后通过读取模型确定名称已成功设置。但对于一个单元测试来说,这似乎是一个很大的挑战

要对成功创建的产品进行单元测试,尽管我需要将产品名称设置为只读公共属性来进行测试,但仅仅为了完成单元测试似乎是不对的。如果没有单元测试,产品名称可以保持私有,一切都可以根据需要工作。

数据是如何从域模型传输到持久存储的?数据是如何从"写"模型到"读"模型的?

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

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

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

这可能有助于记住"单元测试"中对"单元"的一个旧理解——测试是一个单独的、独立的东西,与可能正在运行的其他测试隔绝干扰。

最新更新