c# - 当大多数项目访问的数据库具有我无法更改的糟糕模式时,我如何对我的项目进行单元测试?

标签 c# asp.net linq unit-testing

我正在从事 asp.net Webforms 项目。

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

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

根据我的理解,单元测试不应该直接调用数据库,因为那样会很慢,所以我想将它们与数据库分离。我首先尝试使用一个名为 MOQ 的模拟框架,它似乎有效,但后来我读到 LINQ 对数据库的查询与 LINQ 对对象的查询具有不同的行为,因此测试通过并不意味着我的方法有效

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

  • 将项目更改为使用存储库模式是一项艰巨的工作,我不确定存储库模式是否是完成这项工作的正确工具。所以我想事先知道它是否合适。
  • 数据库架构不是很好,它是由另一家公司为我们制作的,他们只是采用通用架构并在几个表中添加几行来为我们“定制”。很多表和列的命名很糟糕,它不能包含我们需要它包含的所有数据,逻辑结构也不太适合我们,需要复杂的查询。我很确定正确的解决方案是重写模式以适合我们,但 CTO 希望它保持不变,以便制作数据库和项目的公司可以更轻松地修改项目,如果我们愿意的话,所以这不是一个选择。

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

如果您能给我示例和教程的链接,并告诉我我的假设是否错误,我将非常高兴。

预先感谢您的耐心等待和帮助。

最佳答案

如果是我,我不会为此专注于单元测试。我会首先尝试获得一套端到端测试,以表征系统的行为。然后,当您重构系统的某些部分时,您有信心事情不会像以前那样崩溃。

正如您所指出的,不同的 linq 提供程序具有不同的行为,因此进行端到端测试将确保您实际测试的是系统是否正常工作。

我可以推荐 SpecFlow 作为构建基于行为的测试的好工具,我可以推荐观看 this video on pluralsight详细了解 SpecFlow 并很好地解释为什么端到端测试比单元测试更好。

阅读'Working effectively with legacy code'你也会收获很多并阅读一些链接和评论 here也可能有用。

你会注意到上面链接的一些评论指出你需要编写单元测试,但通常你需要重构才能编写测试*因为代码当前不可测试),但是这没有单元测试是不安全的。第 22 条军规。编写端到端测试通常可以让您摆脱这个第 22 条军规,但代价是测试套件运行缓慢。

关于c# - 当大多数项目访问的数据库具有我无法更改的糟糕模式时,我如何对我的项目进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26735153/

相关文章:

javascript - 如何在 asp.net 中回发后更改 html td 元素的颜色?

c# - db4o 似乎不存储添加到 List<T> 的项目

c# - asp.net中如何调用JS函数

c# - 如何将 HttpRequest 接收到 MVC 3 Controller 操作中?

c# - 底层连接已关闭 : An unexpected error occurred on a receive

ASP.Net 呈现的不正确的背景图像样式

asp.net 页面的 preinit 事件

c# - 没有匹配项时的 LINQ 结果?

wpf - Linq 数据上下文和 "unit of work"

c# - 如何使用 LINQ.FOREACH 访问父级