Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用fluent-API配置模拟DbContext_C#_Entity Framework_Unit Testing_Mocking - Fatal编程技术网

C# 使用fluent-API配置模拟DbContext

C# 使用fluent-API配置模拟DbContext,c#,entity-framework,unit-testing,mocking,C#,Entity Framework,Unit Testing,Mocking,在实体框架中,您可以通过使用实际类实体中的数据注释来配置实体之间的关系: public class Entity { [Key, Column(Order = 0)] public Guid PartOfPrimaryKey { get; set; } [Key, Column(Order = 1)] public Guid AlsoPartOfPrimaryKey { get; set; } } 或者使用fluent API配置 modelBuild

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

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

    [Key, Column(Order = 1)]
    public Guid AlsoPartOfPrimaryKey { get; set; }
}
或者使用fluent API配置

    modelBuilder.Entity<Entity>()
                .HasKey(k => new { k.PartOfPrimaryKey, k.AlsoPartOfPrimaryKey });
modelBuilder.Entity()
.HasKey(k=>new{k.PartOfPrimaryKey,k.AlsoPartOfPrimaryKey});
假设您使用了fluent API配置方法,那么如何确保在模拟(使用Moq)DbContext进行单元测试时执行配置?

当我模拟
DbContext
时,不会执行方法
OnModelCreating

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

旁注:我也知道对DbContext进行单元测试可能根本不是一个好主意,因为。然而,我仍然认为我的问题有答案


更新:如果我改用数据注释,它工作得很好。

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

模拟DbContext进行单元测试的一个好方法是使用内存中的DB,该单元测试将与Fluent API、注释等一起工作。即使是一个DB,它仍然足够快,可以进行单元测试。它还允许您以透明的方式模拟插入读取或插入更新读取序列

请看下面的问答(不要认为公认的答案是最好的,因为它不是):


起初,我还使用Moq对数据库测试代码。但过了一段时间,我遇到了一些问题,一切都没有达到预期效果

现在我在这里使用这个:


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

我认为你是对的,我首先犯的错误是模仿我们的数据库上下文。虽然这不是对这个问题的完整回答,但因为你的第一句话,我把它标记为“接受”。更正确的方法是模拟接口,如果您需要执行modelbuilder以强制验证,则使用内存中的数据库可能是正确的选择。至于为什么不调用OnModelCreating,实际答案是什么?@sovemp,因为它是模拟的。mock不是
DbContext
类,而是它的一个mock,因此它没有
DbContext
功能,包括对fluent API配置的调用。即使没有看到
DbContext
mock实现,我也确信它使用了实体类,因此它们的数据注释属性是可用的。这就是为什么数据注释工作得很好,而fluentapi却不行。