【问题标题】:Unit Test EntityFrameworkCore IEntityTypeConfiguration<T>单元测试 EntityFrameworkCore IEntityTypeConfiguration<T>
【发布时间】:2023-01-18 23:21:24
【问题描述】:
如何对 EntityFrameworkCore.IEntityTypeConfiguration 进行单元测试?
我想确保我的配置经过单元测试,原因有以下几个:
- 避免创建更多依赖于数据设置的集成测试的负担
- 使用功能标志框架,我想确保根据标志的状态映射到不同的视图和表
- 我有几个我必须确保使用的自定义转换器
- 简单地说,我希望清晰的自包含测试失败,以防有人更改不应该更改的内容,此时他们必须有意删除测试
我无法找到这个问题的答案,所以我不得不自己去挖掘它。
【问题讨论】:
标签:
c#
entity-framework-core
【解决方案1】:
var sut = new MyEntityTypeConfiguration();
var entityType = new EntityType("MyEntityName", typeof(MyEntityName), new Model(), false, ConfigurationSource.Convention);
var builder = new EntityTypeBuilder<MyEntityName>(entityType);
sut.Configure(builder);
// Metadata will contain all the set configurations
var meta = builder.Metadata;
var properties = builder.Metadata.GetDeclaredProperties();
var viewName = builder.Metadata.GetViewName();
[..]
我建议在您的测试库中使用这样的方法来简化设置
private static EntityTypeBuilder<T> GetEntityBuilder<T>() where T : class
{
#pragma warning disable EF1001 // Internal EF Core API usage.
var entityType = new EntityType(typeof(T).Name, typeof(T), new Model(), false, ConfigurationSource.Convention);
var builder = new EntityTypeBuilder<T>(entityType);
return builder;
#pragma warning restore EF1001 // Internal EF Core API usage.
}
您将以这种方式使用:
var sut = new MyEntityTypeConfiguration();
var builder = GetEntityBuilder<MyEntity>();
sut.Configure(builder);
var meta = builder.Metadata;
var properties = builder.Metadata.GetDeclaredProperties();
var viewName = builder.Metadata.GetViewName();
调用 configure 方法后,构建器元数据属性将包含正确 EF 配置所需的所有详细信息,这些信息是可访问的,您可以在这些信息上执行任何所需的断言。