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

有帮助吗?

解决方案

更新:

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

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

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

我的旧帖子:

*我发现这些博客是制作 DataContext 包装器的良好开端:链接1 链接2

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

其他提示

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

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

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

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

两者都会自动使用您已在 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

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

Linq 使测试变得更加容易。Linq 查询在列表上的运行效果与在 Linq-to-sql 内容上的运行效果一样好。您可以将 Linq to SQL 替换为列表对象并以这种方式进行测试。

马特瓦在 任性的网络日志 有一篇关于如何模拟可扩展 Linq2Sql 数据上下文的精彩文章。一探究竟 - MOCKS NIX - 可扩展的 LINQ TO SQL 数据上下文

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

另一种选择是使用马特·沃伦的 DataContext 的可模拟版本.

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top