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

时间:2008-09-09 19:14:00

标签: linq unit-testing linq-to-sql

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

7 个答案:

答案 0 :(得分:14)

更新

Fredrik已经在他的博客上提供了一个关于如何对linq2sql应用程序进行单元测试的示例解决方案。您可以在以下网址下载:

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

我不仅认为他发布了一个示例解决方案,他还设法为所有类提取接口,这使得设计更加分离。

我的老帖子:

*我发现这些博客我认为是制作DataContext包装器的良好开端: Link1 Link2

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

答案 1 :(得分:6)

晚了3年,但我就是这样做的:

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

无需编写包装器或执行大量管道工作,只需将.4模板放在.dbml旁边即可获得:

  1. 您的数据上下文的界面,例如IExampleDataContext
  2. 您的数据上下文的内存模拟,例如MemoryExampleDataContext
  3. 两者都将自动使用您已在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层真的很不错。

我在我的博客上覆盖了它:http://web.archive.org/web/20090526231317/http://www.aaron-powell.com/blog/may-2008/unit-testing-linq-to-sql.aspx