人们如何对使用Linq到SQL的代码进行单元测试
人们如何对使用Linq到SQL的代码进行单元测试 通常,您不需要测试使用LINQ to SQL的代码部分,但是如果您真的想测试,您可以使用正在对服务器查询的相同数据集,将它们转换为内存中的对象,并对其运行LINQ查询(这将使用可枚举方法而不是可查询方法) 另一个选择是使用马特·沃伦的人们如何对使用Linq到SQL的代码进行单元测试,linq,unit-testing,linq-to-sql,Linq,Unit Testing,Linq To Sql,人们如何对使用Linq到SQL的代码进行单元测试 通常,您不需要测试使用LINQ to SQL的代码部分,但是如果您真的想测试,您可以使用正在对服务器查询的相同数据集,将它们转换为内存中的对象,并对其运行LINQ查询(这将使用可枚举方法而不是可查询方法) 另一个选择是使用马特·沃伦的 您还可以通过调试器(从IQueryable对象)获取LINQ to SQL使用的SQL语句,手动检查这些语句,然后将它们包括在自动测试中。LINQ使测试更加容易。Linq查询在列表上的效果与在LINQtoSQL上的
您还可以通过调试器(从IQueryable对象)获取LINQ to SQL使用的SQL语句,手动检查这些语句,然后将它们包括在自动测试中。LINQ使测试更加容易。Linq查询在列表上的效果与在LINQtoSQL上的效果一样好。您可以将列表对象的Linq转换为SQL,并以这种方式进行测试。包装DataContext,然后模拟包装器。这是完成测试的最快方法,尽管它需要为测试编写代码,有些人认为这很难闻。但有时,当您有无法(轻松)模拟的依赖项时,这是唯一的方法。Mattwar at有一篇关于如何模拟可扩展Linq2Sql数据上下文的优秀文章。查看它--更新: Fredrik在他的博客上提供了一个关于如何进行linq2sql应用程序单元测试的示例解决方案。您可以从以下网址下载: 我认为,他不仅发布了一个示例解决方案,而且还设法提取了所有类的接口,这使得设计更加解耦 我以前的帖子: *我发现这些博客是制作DataContext包装器的良好开端:
它们涵盖了几乎相同的主题,只是第一个主题实现了提取表接口的方法。第二个更广泛,所以我也包括了它。*LINQ to SQL实际上非常适合进行单元测试,因为它能够根据DBML中定义的内容动态创建数据库 通过DataContext创建DB并让它开始为空,这使得测试ORM层非常好
我在我的博客上写到:3年后,但我就是这样做的: 无需编写包装器或进行大量的管道操作,只需将T4模板放在.dbml旁边,即可获得:
public class ProductRepo {
IExampleDataContext DB { get; set };
public ProductRepo(IExampleDataContext db) {
DB = db;
}
public List<Product> GetProducts() {
return DB.Products.ToList();
}
}
或
为什么有些人不需要测试使用LINQtoSQL的代码部分?例如,我正在编写一个asp.net mvc网页,其中许多控制器使用LINQ to SQL,我必须测试这些控制器……我的意思是,您不需要确保LINQ to SQL本身按照广告的方式工作(因为Microsoft已经为您测试过)与使用LINQ to SQL类的任何结果的代码不同,我只是在尝试使用Linq2Sql的ASP.NET MVC,并尝试为“任务列表”演示应用程序编写一些单元测试。遇到了非常奇怪的错误,然后我偶然发现了这个。看到如此简单的事情阻碍了一个伟大的技术堆栈,我感到非常难过。看看这个答案,看看如何有效和成功地使用LINQ to SQL进行测试:有足够多的查询部分可以很好地使用LINQ to对象,而不使用LINQ to SQL。如果我们有一种机制来测试linq2sql兼容性而不实际运行SQL Server,那就太好了。(对于SQL Server,也就是说,其他DBMS的实现可能支持其他表达式转换)。当您想要测试您的规范模式或DSL以组装查询部件(过滤器、转换、聚合)时,似乎除了对实际的db实例运行测试之外别无选择。还是有?第一个链接上的实际地址不正确,请复制并粘贴该地址以查看真正有用的文章。我能够在回程机器上找到示例代码(zip下载也有效)和Link1,因此这些链接现在已修复。我找不到Link2的工作副本。问题是外键关系(EntitySet/EntityRef)和Colums,其中
IsDbGenerated=true
。使用这种方法时必须小心。LINQtoSQL和LINQtoObject是不同的提供者,不能保证它们的操作完全相同(实际上,它们有时不会)。特别是在这种情况下,其中LINQtoSQL是LINQtoObject的子集。我预测会有很多绿色单元测试,然后是运行时失败。我查看了作者当前的网站,没有找到上面提到的帖子。自从上一个链接被破坏以来,我已经用我能从Way Back机器中找到的最佳匹配项编辑了答案。是的,这篇文章似乎在时间的沙漠中丢失了(和多次迁移)。但实际上,我提出的解决方案不是单元测试,而是集成测试。这是一个很棒的解决方案,非常有效,谢谢!它只在接口中缺少存储过程。
new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing
new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB