人们如何对使用Linq to SQL的代码进行单元测试?
答案 0 :(得分:14)
更新
Fredrik已经在他的博客上提供了一个关于如何对linq2sql应用程序进行单元测试的示例解决方案。您可以在以下网址下载:
我不仅认为他发布了一个示例解决方案,他还设法为所有类提取接口,这使得设计更加分离。
我的老帖子:
*我发现这些博客我认为是制作DataContext包装器的良好开端: Link1 Link2
它们涵盖了几乎相同的主题,除了第一个主题实现了为表提取接口的方法。第二个是更广泛的,所以我也包括它。*
答案 1 :(得分:6)
晚了3年,但我就是这样做的:
https://github.com/lukesampson/LinqToSQL-test-extensions/
无需编写包装器或执行大量管道工作,只需将.4模板放在.dbml旁边即可获得:
两者都将自动使用您已在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
答案 2 :(得分:4)
包装DataContext,然后模拟包装器。它是完成任务的最快方法,因为它需要编码进行测试,有些人认为这些有些气味。但有时,当你拥有无法(轻易)模仿的依赖时,它是唯一的方法。
答案 3 :(得分:2)
Linq使测试变得更加容易。 Linq查询在列表上的工作与在Linq-to-sql上的内容一样。您可以将Linq替换为SQL以获取列表对象并以此方式进行测试。
答案 4 :(得分:2)
在The Wayward Web Log上的Mattwar有一篇关于如何模拟可扩展的Linq2Sql数据上下文的文章。看看 - MOCKS NIX - AN EXTENSIBLE LINQ TO SQL DATACONTEXT
答案 5 :(得分:1)
通常,您不需要测试使用LINQ to SQL的代码部分,但如果您真的想要,则可以使用您要查询服务器的相同数据集并将其转换为 - 内存对象并针对它运行LINQ查询(使用Enumerable方法而不是Queryable)。
另一个选择是使用Matt Warren的mockable version of the DataContext。
您还可以通过调试器(来自IQueryable对象)获取LINQ to SQL使用的SQL语句,手动检查它们,然后将它们包含在自动化测试中。
答案 6 :(得分:1)
LINQ to SQL实际上非常适合单元测试,因为它能够根据DBML中定义的内容动态创建数据库。
通过DataContext创建数据库并将其打开为空来测试ORM层真的很不错。