C# 应用CQRS-是否需要对薄读取层进行单元测试?

C# 应用CQRS-是否需要对薄读取层进行单元测试?,c#,.net,asp.net-mvc,unit-testing,cqrs,C#,.net,Asp.net Mvc,Unit Testing,Cqrs,考虑到实现CQR的一些建议相当接近于metal查询实现,例如直接针对数据库(或者可能是基于LINQ的ORM)的ADO.NET查询,尝试并对它们进行单元测试是错误的吗 我想知道这是否真的有必要 我对此事的看法: 提供可模仿的“薄阅读层”的额外架构复杂性似乎与将架构仪式保持在最低限度的建议的本质相反 有效地覆盖用户可能编写的每个查询角度的单元测试数量是惊人的 具体地说,我正在ASP.NET MVC应用程序中尝试CQRS,我想知道是麻烦对控制器操作方法进行单元测试,还是只测试域模型 非常感谢。我看到的

考虑到实现CQR的一些建议相当接近于metal查询实现,例如直接针对数据库(或者可能是基于LINQ的ORM)的ADO.NET查询,尝试并对它们进行单元测试是错误的吗

我想知道这是否真的有必要

我对此事的看法:

  • 提供可模仿的“薄阅读层”的额外架构复杂性似乎与将架构仪式保持在最低限度的建议的本质相反

  • 有效地覆盖用户可能编写的每个查询角度的单元测试数量是惊人的
  • 具体地说,我正在ASP.NET MVC应用程序中尝试CQRS,我想知道是麻烦对控制器操作方法进行单元测试,还是只测试域模型


    非常感谢。

    我看到的这种单元测试方法是让单元测试在数据库中创建一组东西,运行单元测试,然后清除创建的东西

    在过去的一份工作中,我看到这个设置非常好地使用数据结构来描述对象及其关系。这是通过ORM来创建这些对象、关系、用于查询的数据,然后使用ORM来删除这些对象。为了使单元测试更容易,可以设置每个类指定的默认值,以便在没有覆盖这些值的单元测试中使用。然后,单元测试中的数据结构只需要指定非默认值,这使得单元测试的设置更加紧凑


    这些单元测试非常有用,并捕获了数据库交互中的许多错误。

    在我的一个asp.net mvc应用程序中,我还应用了sqrc。但我们使用的不是sql和“ADO.NET查询”或“Linq”,而是每个命令或事件处理程序直接更新数据库

    我已经为一个命令/事件处理程序创建了一个测试。经过100%的单元测试后,我知道我的域在95%的正确率上工作。 但是对于操作/控制器/ui,我已经应用了ui测试(使用)

    因此,似乎域的单元测试(命令/事件处理程序和数据库的直接更新)和ui测试都是“集成测试”

    我认为您至少应该测试域部分,因为您的所有逻辑都包含在命令/事件处理程序中


    仅供参考:我也开始首先从实体框架开发领域部分,而不是通过存储过程直接更新到数据库,但对文档数据库非常满意。我尝试了一些不同的文档数据库,但mongodb看起来最适合我。

    我倾向于同意您的观点,即单元测试这种代码没有什么好处。但仍有一些有用的测试空间

    您必须对用户的读取查询参数执行一些验证,如果是,则测试无效的请求参数是否引发适当的异常,并且允许使用有效的参数

    如果您使用的是ORM,我发现测试映射代码的成本/收益比太高了。假设您的ORM已经过测试,映射中可能会有错误,但您很快就会发现并修复它们


    我还发现编写一些集成测试(使用相同的测试框架)很有用,只是为了确保我可以连接到数据库,并且ORM配置不会引发任何映射异常。您当然不想编写查询实际数据库的单元测试。

    因为您可能已经知道,单元测试与其说是关于代码覆盖率和防止bug,不如说是关于良好的设计。虽然我在匆忙中经常跳过对读取模型事件处理程序的测试,但毫无疑问,由于代码应该是TDD的所有原因,可能应该这样做

    我还没有对我的HTTP操作进行单元测试(因为我使用的是Nancy而不是.NETMVC,所以我没有控制器本身)

    这些都是集成点,不包含太多逻辑,因为大部分都封装在命令处理程序和域模型中

    我认为不测试这些是相当容易的,因为它们非常简单且重复性很强,在将事件非规范化为read模型的过程中几乎没有深入的思考。我的HTTP处理程序也是如此,它几乎只处理请求并向域发出命令,并带有一些基本逻辑,用于向客户端返回响应

    在开发时,我经常在代码中出错,如果我使用TDD,我可能会犯更少的错误,但这也需要更长的时间,而且这些错误往往很容易发现和修复


    我的直觉告诉我我仍然应该在这里应用TDD,尽管它仍然是松散耦合的,编写测试应该不难。如果您发现很难编写可能指示控制器中有代码气味的测试。

    根据我的经验,如果您正在创建一个良好的非规范化读取模型,您将要进行的90%-99%的读取不需要在它们周围进行单元测试


    我发现,对CQRS应用程序进行TDD的最有效和最高效的方法是编写集成测试,将命令推送到您的域中,然后使用查询从数据库中获取数据以进行断言。

    感谢您的建议,但这不是严格意义上的单元测试,而是集成测试。在我的开发机器上,我真的不想要这样的开销。“有效地覆盖用户可能编写的每个查询角度的单元测试的数量是可怕的。”你能解释一下吗?为什么用户要自己创建查询?您的查询端应该是解决这一问题的关键,然后您可以在2上测试您的查询/视图服务(如果您确实需要缩小视图的范围)也许你应该开始思考用户的实际需求,而不是承诺完全的自由。单元测试似乎是重复的