我有DbContext
个多个DbSet<>
属性。
其中一些DbSet<>
具有Icollection<>
个对象(导航属性)。
我想编写一个单元测试,检查所有ICollection<>
属性是否在我的实体构造函数中实例化。
这是我到目前为止的地方:
// this.ctx is the instance of my DbContext
var allProps = this.ctx.GetType().GetProperties();
var allDbSets = allProps.Where(pi => pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>));
var allEntities = allDbSets.SelectMany(pi => pi.PropertyType.GetGenericArguments());
foreach (var entity in allEntities)
{
// get collections of entity
var genericProps = entity.GetProperties().Where(pi => pi.PropertyType.IsGenericType);
var collections = genericProps.Where(pi => pi.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>));
if(collections.Any())
{
foreach (var coll in collections)
{
// coll is the PropertyInfo of a ICollection<> object.
}
}
}
从那里我被阻止了。我不知道如何测试该集合是否已实例化。
感谢您的帮助!
答案 0 :(得分:0)
我经常在发布问题后找到答案......
我只需要实例化实体并获取collection属性的值以检查它是否为空。
var allProps = this.ctx.GetType().GetProperties();
var allDbSets = allProps.Where(pi => pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>));
var allEntities = allDbSets.SelectMany(pi => pi.PropertyType.GetGenericArguments());
foreach (var entity in allEntities)
{
// get collections of entity
var genericProps = entity.GetProperties().Where(pi => pi.PropertyType.IsGenericType);
var collections = genericProps.Where(pi => pi.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>));
if(collections.Any())
{
var ent = Activator.CreateInstance(entity);
foreach (var coll in collections)
{
// coll is the PropertyInfo of a ICollection<> object.
var val = coll.GetValue(ent);
Assert.IsNotNull(val);
}
}
}