c# - 使用流畅的 API 配置模拟 DbContext

标签 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是对如何使用模拟框架测试您的应用程序的解释,但它没有解释他们如何处理“配置”实体的问题。我发现的其他帖子也没有解决这个问题。我想我缺少一些简单的东西。

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

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

最佳答案

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

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

请查看此问答(不要将已接受的答案视为最佳答案,因为它不是):

Is there an in-memory provider for Entity Framework?

关于c# - 使用流畅的 API 配置模拟 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25408072/

相关文章:

c# - 在列表中查找匹配项的最简洁方法

c# - 如何在数据库优先中创建鉴别器列

entity-framework - 如何升级 EF Core 工具

c# - 模拟 UdpClient 进行单元测试

angularjs 路由单元测试

unit-testing - 如何对 tornado + async def 进行单元测试?

C# 通过配置文件忽略证书错误

c# - 如何使用 REGEX 将作者拆分为对象或数组 C#?

c# - TeamCity 构建失败,因为子进程以非零退出代码退出

c# - Oracle Entity Framework 'Specified cast is not valid' GetDecimal