人们如何对使用 Linq to SQL 的代码进行单元测试?
7 回答
晚了 3 年,但这就是我的做法:
https://github.com/lukesampson/LinqToSQL-test-extensions/
无需编写包装器或做大量的工作,只需将 T4 模板放在 .dbml 旁边即可:
- 数据上下文的接口,例如 IExampleDataContext
- 用于数据上下文的内存模拟,例如 MemoryExampleDataContext
两者都将自动使用您已经在 DBML 中配置的映射。
所以你可以做类似的事情
public class ProductRepo {
IExampleDataContext DB { get; set };
public ProductRepo(IExampleDataContext db) {
DB = db;
}
public List<Product> GetProducts() {
return DB.Products.ToList();
}
}
你可以用任何一个来调用它
new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing
或者
new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB
包装 DataContext,然后模拟包装器。这是完成它的最快方法,尽管它需要为测试编码,有些人认为这很奇怪。但有时,当您有无法(轻松)模拟的依赖项时,这是唯一的方法。
通常,您不需要测试使用 LINQ to SQL 的代码部分,但如果您真的想要,您可以使用您在服务器上查询的相同数据集并将它们转换为内存中的对象和对此运行 LINQ 查询(这将使用 Enumerable 方法而不是 Queryable)。
另一种选择是使用 Matt Warren 的可模拟版本的 DataContext。
您还可以通过调试器(从 IQueryable 对象)获取 LINQ to SQL 使用的 SQL 语句,手动检查这些语句,然后将它们包含在自动化测试中。
Linq 使测试变得更加容易。Linq 查询在 Lists 上和在 Linq-to-sql 的东西上一样好。您可以将 Linq 换成 SQL 以获取列表对象并以这种方式进行测试。
The Wayward Web Log上的Mattwar有一篇很棒的文章,介绍了如何模拟可扩展的 Linq2Sql 数据上下文。看看——MOCKS NIX——一个可扩展的 LINQ TO SQL DATACONTEXT
LINQ to SQL 实际上非常适合进行单元测试,因为它能够根据 DBML 中定义的内容动态创建数据库。
通过通过 DataContext 创建 DB 并将其设为空来测试 ORM 层非常好。
我在这里的博客上介绍了它:http://web.archive.org/web/20090526231317/http: //www.aaron-powell.com/blog/may-2008/unit-testing-linq-to-sql。 aspx