58

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

4

7 回答 7

14

更新:

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

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

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

我的旧帖:

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

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

于 2008-09-24T05:32:03.767 回答
5

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

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

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

  1. 数据上下文的接口,例如 IExampleDataContext
  2. 用于数据上下文的内存模拟,例如 MemoryExampleDataContext

两者都将自动使用您已经在 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
于 2012-02-19T22:32:30.630 回答
4

包装 DataContext,然后模拟包装器。这是完成它的最快方法,尽管它需要为测试编码,有些人认为这很奇怪。但有时,当您有无法(轻松)模拟的依赖项时,这是唯一的方法。

于 2008-09-09T19:56:25.617 回答
2

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

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

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

于 2008-09-09T19:20:09.120 回答
2

Linq 使测试变得更加容易。Linq 查询在 Lists 上和在 Linq-to-sql 的东西上一样好。您可以将 Linq 换成 SQL 以获取列表对象并以这种方式进行测试。

于 2008-09-09T19:23:26.913 回答
2

The Wayward Web Log上的Mattwar有一篇很棒的文章,介绍了如何模拟可扩展的 Linq2Sql 数据上下文。看看——MOCKS NIX——一个可扩展的 LINQ TO SQL DATACONTEXT

于 2008-09-09T20:55:16.240 回答
1

LINQ to SQL 实际上非常适合进行单元测试,因为它能够根据 DBML 中定义的内容动态创建数据库。

通过通过 DataContext 创建 DB 并将其设为空来测试 ORM 层非常好。

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

于 2008-10-05T11:36:18.063 回答