Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
人们如何对使用Linq到SQL的代码进行单元测试_Linq_Unit Testing_Linq To Sql - Fatal编程技术网

人们如何对使用Linq到SQL的代码进行单元测试

人们如何对使用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上的

人们如何对使用Linq到SQL的代码进行单元测试

通常,您不需要测试使用LINQ to SQL的代码部分,但是如果您真的想测试,您可以使用正在对服务器查询的相同数据集,将它们转换为内存中的对象,并对其运行LINQ查询(这将使用可枚举方法而不是可查询方法)

另一个选择是使用马特·沃伦的


您还可以通过调试器(从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旁边,即可获得:

  • 数据上下文的接口,例如IExampleDataContext
  • 数据上下文的内存内模拟,例如MemoryExampleDataContext
  • 两者都将自动使用已在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