使用流畅的API配置模拟DbContext

时间:2014-08-20 14:58:57

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

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

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 });

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

当我嘲笑DbContext时,方法OnModelCreating没有被执行。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

请参阅此问答(并且不要将接受的答案视为最佳答案,因为它不是):

Is there an in-memory provider for Entity Framework?

答案 1 :(得分:0)

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

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

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