使用IRepositories对所有IEntity进行单元测试
本文关键字:单元测试 IEntity IRepositories 使用 | 更新日期: 2023-09-27 18:20:03
我们有大约300个POCO对象,每个对象都继承自IEntity接口。在我们的服务层中,我们有一个IRepository和一个DbContext,其中包含为每个POCO类指定的所有EntityTypeConfigurations。
我们正在尝试对这些进行单元测试,以确保映射是正确的。有没有一种方法可以为程序集中的所有IEntity对象自动调用下面的helper方法。
internal static void TestRepositoryForEntity<T>(T obj) where T : class, IEntity
{
ILogger logger = new Logging.NLog.NLogLogger(null);
IConnectionProvider connectionProvider = new ConnectionProvider(logger);
IEntityRepository<T> testRepo = new BaseEntityRepository<T>(connectionProvider);
var allResults = testRepo.GetAll();
foreach (var item in allResults)
{
Console.WriteLine(item);
}
}
目前我们这样称呼它:
Helpers.EntityContextHelper.TestRepositoryForEntity(new Zinc.Entities.User());
但是,如果我尝试获取所有的IEntity对象,并将它们传递给helper中的T类型,则是IEntity,并且找不到正确类型的映射。
将对象的实例作为参数传递似乎有点奇怪;为什么不删除它,只调用TestRespositoryForEntity<Zinc.Entities.User>()
。(如果一个类型是抽象的呢?)不管怎样;如果你在某个地方有一个程序集,你可以调用这样的通用方法:
var assembly = typeof (User).Assembly;
var typeList = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract
&& typeof (IEntity).IsAssignableFrom(t));
MethodInfo testMethodInfo =
typeof (Helpers.EntityContextHelper)
.GetMethod("TestRepositoryForEntity").GetGenericMethodDefinition();
foreach (var type in typeList)
{
Console.WriteLine("Checking type {0}", type.FullName);
//we need an instance;
object instance = Activator.CreateInstance(type);
//create the correct generic method:
var testMethodToCall = testMethodInfo.MakeGenericMethod(type);
//invoke
testMethodToCall.Invoke(null, new [] { instance });
}