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

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

How are people unit testing code that uses Linq to SQL

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


更新:

Fredrik在他的博客上提供了一个示例解决方案示例,说明如何对linq2sql应用程序进行单元测试。您可以从以下位置下载:

http://web.archive.org/web/20120415022448/http://iridescence.no/post/DataContext-Repository-Pattern-Example-Code.aspx

我不仅觉得发布一个示例解决方案很棒,而且还设法提取了所有类的接口,这使设计更加分离。

我的旧帖子:

*我发现这些博客是制作DataContext包装器的一个很好的开始:
链接1
链接2

它们涵盖几乎相同的主题,除了第一个实现了为表提取接口的方法。第二个虽然更广泛,所以我也将其包括在内。*


迟到了3年,但这是我的方法:

https://github.com/lukesampson/LinqToSQL-test-extensions/

无需编写包装器或做大量的工作,只需将T4模板放在.dbml旁边,您将获得:

  • 数据上下文的接口,例如IExampleDataContext
  • 您的数据上下文的内存中模拟MemoryExampleDataContext
  • 两者都将自动使用您已在DBML中配置的映射。

    所以你可以做类似的事情

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class ProductRepo {
        IExampleDataContext DB { get; set };
        public ProductRepo(IExampleDataContext db) {
            DB = db;
        }

        public List<Product> GetProducts() {
            return DB.Products.ToList();
        }
    }

    你可以用

    1
    new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing

    要么

    1
    new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB

    包装DataContext,然后模拟包装器。这是最快的方法,需要对测试进行编码,有些人认为这很奇怪。但是有时候,当您具有无法(轻松)嘲笑的依赖项时,这是唯一的方法。


    Mattward在The Wayward Web Log上发表了一篇很棒的文章,内容涉及如何模拟可扩展的Linq2Sql数据上下文。签出-MOCKS NIX-SQL DATACONTEXT的可扩展LINQ


    Linq使测试变得更加容易。 Linq查询在List上的工作与Linq-to-sql上的工作一样好。您可以将Linq换成SQL以获得列表对象,然后进行测试。


    通常,您不需要测试使用LINQ to SQL的代码的一部分,但是如果您确实愿意,则可以使用针对服务器查询的相同数据集,并将它们转换为内存中对象,然后对它运行LINQ查询(它将使用Enumerable方法而不是Queryable)。

    另一种选择是使用Matt Warren的DataContext的可模拟版本。

    您还可以通过调试器(从IQueryable对象)获取LINQ to SQL使用的SQL语句,手动对其进行检查,然后将其包括在自动化测试中。


    LINQ to SQL实际上非常适合单元测试,因为它具有根据DBML中定义的内容快速创建数据库的能力。

    通过DataContext创建数据库并使之开始为空,可以非常好地测试ORM层。

    我在以下博客中对此进行了介绍:http://web.archive.org/web/20090526231317/http://www.aaron-powell.com/blog/may-2008/unit-testing-linq-to-sql。 aspx


    推荐阅读