【问题标题】:Mocking DbContext with fluent API configuration使用流畅的 API 配置模拟 DbContext
【发布时间】:2014-10-14 00:12:55
【问题描述】:

在实体框架中,您可以通过在实际类实体中使用数据注释来配置实体之间的关系:

public class Entity
{
    [Key, Column(Order = 0)]
    public Guid PartOfPrimaryKey { get; set; }

    [Key, Column(Order = 1)]
    public Guid AlsoPartOfPrimaryKey { get; set; }
}

或使用流畅的 API 配置

    modelBuilder.Entity<Entity>()
                .HasKey(k => new { k.PartOfPrimaryKey, k.AlsoPartOfPrimaryKey });

假设您使用了 fluent API 配置方法,您如何确保在模拟(使用 Moq)DbContext 进行单元测试时执行配置?

当我模拟DbContext 时,方法OnModelCreating 没有被执行。

Here 解释了如何使用模拟框架测试您的应用程序,但没有解释他们如何解决“配置”实体的问题。我发现的其他帖子也没有解决这个问题。我想我缺少一些简单的东西。

旁注:我也知道对 DbContext 进行单元测试可能根本不是一个好主意,因为you will use LINQ to Objects in your tests and LINQ to entites in production。但是,我仍然认为我的问题有答案。

更新:如果我改用数据注释,它可以正常工作。

【问题讨论】:

    标签: c# entity-framework unit-testing mocking


    【解决方案1】:

    我永远不会嘲笑 ORM。我更喜欢创建实现接口(例如存储库)并模拟该接口的中间类。不过,让我们看看我能为您做什么:

    模拟 DbContext 以进行单元测试(可与 Fluent API、注释等一起使用)的一种好方法是使用内存数据库。即使它是一个数据库,对于单元测试来说仍然足够快。它还允许您以透明的方式模拟插入读取或插入更新读取序列。

    请参阅此问答(不要将公认的答案视为最佳答案,因为它不是):

    Is there an in-memory provider for Entity Framework?

    【讨论】:

    • 我认为你是对的,我首先做错的是模拟我们的 DbContext。尽管这不是对该问题的完整答案,但由于您的第一个陈述,我将其标记为“已接受”。更正确的方法是模拟接口,如果您需要执行模型构建器来强制验证,使用内存数据库可能是正确的选择。
    • 关于为什么 OnModelCreating 没有被调用的实际答案是什么?
    • @sovemp 因为它是一个模拟。模拟不是DbContext 类,而是它的模拟,所以它没有Dbcontext 功能,包括调用流畅的API 配置。即使没有看到 DbContext 模拟实现,我确信它使用实体类,因为它们是,所以它们的数据注释属性是可用的。这就是为什么数据注释可以正常工作,而流畅的 API 不能。
    【解决方案2】:

    起初,我还使用 Moq 来针对数据库测试我的代码。但过了一会儿,我遇到了问题,没有按预期工作。

    现在我在这里使用这个: http://effort.codeplex.com/

    看看吧。对我来说,测试我的代码要容易得多。而且为它编写测试要快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多