作者:拾味湖 | 2023-09-02 13:56
我想测试使用Entity Framework构建的实体.我担心的是使用实体框架意味着直接使用数据源.那么任何想法如何单元测试基于Entity Framework的组件?
1> Hans Kesting..:
对于Enity Framework 4,这看起来很有希望:可测试性和实体框架4.0
仅供参考,他从不在UnitOfWork类中处理上下文.在这个例子中,http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application,UnitOOfWork class实现IDisposable.结合这两种方法并在Hans的答案中用IDisposible修饰IUnitOfWork接口并实现Dispose模式,例如http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.71).aspx
2> gef..:
显然这很难.Erik在这里雄辩地提出了 - TDD和ADO.NET实体框架
3> James McLach..:
一种廉价的方法是设置一个与真实数据库结构相同的数据库文件,并将单元测试配置中的连接字符串设置为指向该文件.数据库不需要拥有真实数据库的所有表; 只是单元测试需要的.
缺点是您需要管理数据库的状态,以便单元测试在运行期间和运行之间不会相互影响.
我知道这种方法在真实和单元测试数据库使用SQL Express时都有效,但我不知道在SqlExpress数据库中存根用于完整的SQL数据库.
我意识到这是技术上的集成测试,但它可能比重构代码或学习模拟框架更便宜.
实例连接字符串示例:
示例单元测试连接字符串:
到目前为止,这对我来说是最好的解决方案.如果要加快速度,请在RAM中运行整个数据库.这些是端到端测试.嘲弄解决方案根本就没有解决方案.测试数据库的关键不仅在于测试持久存储,还在于测试查询.查询测试只有在实际运行时才有意义 - 模拟在这里纯粹浪费时间 - 你需要虚假的表数据.我尝试为Linq2Sql创建一整套虚假存储库,但这是浪费时间,因为无法测试使用左连接的查询 - 我担心EF存在同样的问题.
这似乎是完全测试我的应用程序的唯一方法.模拟IRepository将允许您测试_uses_您的数据访问代码而不是您的_actual_数据访问代码的代码,这是我的错误的90%.
设置数据非常简单 - 请阅读Microsoft关于单元测试存储过程的建议.同样的原则适用 - 您启动事务,截断表,并插入您需要的测试数据; 然后运行测试,最后回滚事务.DB最终处于开始状态,您可以管理每个测试的测试数据.