Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing CQRS系统中域模型属性的单元测试_Unit Testing_Domain Driven Design_Cqrs_Accessor - Fatal编程技术网

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

Unit testing CQRS系统中域模型属性的单元测试,unit-testing,domain-driven-design,cqrs,accessor,Unit Testing,Domain Driven Design,Cqrs,Accessor,我正在寻找其他人对一个特定场景的想法:在使用CQR的应用程序中对域模型(实体、VO等)属性进行单元测试 想象一个产品(实体)的简化示例,带有产品名称(VO) 该产品有一些基本的防护栏和不变量: 产品名称不能超过100个字符(在VO中强制) 产品必须具有产品名称(在实体中强制,在构造函数中设置产品名称以确保其始终有效) 我可以对产品实体和产品名称VO进行单元测试,以确保通过确保引发正确的错误和异常来正确执行它们。简单 我的问题是关于单元测试的快乐之路——当产品最初开发时,成功地设置了产品名称

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

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

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

  • 产品名称不能超过100个字符(在VO中强制)
  • 产品必须具有产品名称(在实体中强制,在构造函数中设置产品名称以确保其始终有效)
我可以对产品实体和产品名称VO进行单元测试,以确保通过确保引发正确的错误和异常来正确执行它们。简单

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

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

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

单元测试成功创建产品虽然我需要将产品名称设置为只读公共属性来测试它,但仅仅为了完成单元测试似乎并不正确。没有单元测试,产品名称可以保持私有,一切都可以根据需要工作

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

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

单元测试成功创建产品虽然我需要将产品名称设置为只读公共属性来测试它,但仅仅为了完成单元测试似乎并不正确。没有单元测试,产品名称可以保持私有,一切都可以根据需要工作

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

在代码库中的某个地方,您有一个函数,该函数将
产品
作为输入,并返回它的一些不可知域表示(字节[],或JSON,或其他任何形式),或者您有一个方法,该方法将
产品
作为参数,以及一个接受某些不可知域表示的回调

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

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

记住“单元测试”中对“单元”的一个古老理解可能会有所帮助,即测试是一个单独的独立的东西,与可能正在运行的其他测试的干扰隔离

class Product
private ProductName productName