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却不行。