单元使用IRepositories测试所有IEntity

时间:2014-08-29 13:19:07

标签: c# unit-testing generics

我们有大约300个POCO对象,每个对象都继承自IEntity接口。在我们的服务层中,我们有一个IRepository和一个DbContext,其中包含为每个POCO类指定的所有EntityTypeConfiguration。

我们正在尝试对这些进行单元测试以确保映射是正确的。有没有办法可以为程序集中的所有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对象并在帮助器中传递那些超过T类型的对象是IEntity,并且找不到正确类型的映射。

1 个答案:

答案 0 :(得分:0)

将对象的实例作为参数传递似乎有些奇怪;为什么不删除它,只需拨打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 });
}