当大多数项目访问的数据库模式不好,我无法更改时,我该如何对项目进行单元测试

本文关键字:项目 单元测试 访问 大多数 数据库 模式 | 更新日期: 2023-09-27 18:28:58

我正在做一个asp.net Webforms项目。

这个项目根本没有任何测试,除了我自己写的几个单元测试之外,我还写了一个小的静态方法。我想为整个项目编写单元测试,这样我就可以更有效地重构和添加代码到项目中(我得到了CTO的支持),但我遇到了一个问题。

web应用程序主要由对数据库的linq查询组成,数据库和代码之间没有抽象,换句话说,我们不使用类似存储库的东西,而是在需要的地方键入linq查询。

根据我的理解,单元测试不应该直接调用数据库,因为这会减慢速度,所以我想将它们与数据库解耦。我第一次尝试使用一个名为MOQ的模拟框架,它似乎可以工作,但后来我读到,对数据库的LINQ查询与对对象的LINQ询问有不同的行为,所以通过测试并不意味着我的方法可以工作

这让我考虑了存储库模式,将linq查询隐藏在存储库类中,然后在测试中模拟这些类。据我所知,这有两个问题。

  • 将项目更改为使用存储库模式是一项艰巨的工作,我不确定存储库模式是否是正确的工具。所以我想事先知道它是否合适
  • 数据库架构不是很好,它是另一家公司为我们制作的,他们只是采用了一个通用架构,在几个表中添加了几行,为我们"自定义"。许多表和列的名称不好,无法包含我们需要包含的所有数据,逻辑结构也不太适合我们,这需要复杂的查询。我敢肯定,正确的解决方案是重写模式以适合我们,但CTO希望它保持不变,这样,如果我们希望,数据库和项目的制造商可以更容易地修改项目,所以这不是一个选择

假设我应该使用存储库模式,那么我的问题是,如何处理糟糕的数据库模式。我认为我需要把它隐藏在一个抽象后面,为我处理复杂的查询,也许画一个er图来弄清楚模式应该是什么样子,但我可能错了,我不确定细节。

如果你能给我一些例子和教程的链接,并告诉我我的假设是否错误,我会很高兴。

提前感谢您的耐心和帮助。

当大多数项目访问的数据库模式不好,我无法更改时,我该如何对项目进行单元测试

如果是我,我不会专注于单元测试。我会首先尝试获得一套端到端的测试,这些测试描述了系统当前的行为。然后,当你重构系统的某些部分时,你会有一些信心,事情不再像以前那样坏了。

正如您所指出的,不同的linq提供者有不同的行为,因此进行端到端测试将确保您实际测试系统的工作情况。

我可以推荐SpecFlow作为构建基于行为的测试的一个很好的工具,我可以推荐在pluralsight上观看这段视频,以了解SpecFlow的精彩概述,并很好地解释为什么端到端测试可能比单元测试更好。

阅读"有效地使用遗留代码"也会让你受益匪浅,阅读这里的一些链接和评论也可能很有用。

您会注意到,上面链接的一些注释指出,您需要编写单元测试,但通常需要在编写测试之前进行重构(因为代码当前不可测试),但如果没有单元测试,这是不安全的。第二十二条军规。编写端到端测试通常可以让你摆脱这条军规,代价是拥有一个运行缓慢的测试套件。

当我们编写单元测试时,数据库模式应该无关紧要,因为我们将通过模拟它来阻止对数据库的调用

  1. 如果数据库调用已经在他们自己的项目中,比如DAL,那么最好的方法是创建接口并通过DAL类实现,例如CustomerClass:ICustomerClass这将在嘲弄
  2. 如果时间和预算允许,那么存储库模式就是先去写集成测试,它将覆盖整个系统一旦编写了集成测试,就可以重构密码您总是可以通过运行集成测试。一旦类被重构,编写单元测试它。你可以/应该总是编写有帮助的场景通过使用SPECFLOW集成/单元测试

不要深入代码并重新考虑它,做一些分析工作并制作一个文档,相信我这个文档会派上用场的。