使用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,并且找不到正确类型的映射。

使用IRepositories对所有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 });
}