如何测试驱动器构建动态程序集

问题描述:

我正在为用于IBM Db2数据库的LINQPad构建动态上下文驱动程序。我一直在测试驾驶大部分代码,并且我认为我已经完成了获取所需的关于我需要的数据库的所有信息。 (我以后可能需要更多,但现在看来足够了)。我下载了PostgreSQL上下文驱动程序的git仓库,并且(稍微)看到它是如何构建的。没有足够的测试让我有信心确信自己正在构建程序集。但后来我开始思考,如果我要开始构建这个动态组合,我不知道如何测试驱动器。我想开始这样简单:如何测试驱动器构建动态程序集

[TestFixture] 
public class Db2DynamicAssemblyBuilderTests 
{ 
    [Test] 
    public void DynamicClassHasMatchingNameAsTable() 
    { 
     List<Models.Db2TableInformation> tableInformation = new List<Models.Db2TableInformation>(); 
     tableInformation.Add(new Models.Db2TableInformation() 
     { 
      Schema = "Schema", 
      TableName = "TableName" 
     }); 
     AssemblyName assemblyToBuild = new AssemblyName(@"c:\temp\someassembly.dll");//somehow build this with a dynamic name???? i'll figure this out 
     string nameSpace = "LINQPad.User"; 
     string typeName = "TypeDataContext"; 
     var target = new Db2DynamicAssemblyBuilder(assemblyToBuild, nameSpace, typeName); 

     target.Build(tableInformation); 

     //??? Load assembly? 
     //Get Class LINQPad.User.Schema.TableName (or maybe just LINQPad.User.TableName...not sure yet) 
    } 
} 

所以这是正确的做法?这是我该怎么做的?

为了概括你的问题,你问的是如何最好的单元测试动态构建的程序集。难点在于,在您运行代码生成代码之前,所讨论的程序集不存在,因此您无法引用程序集并静态绑定它。

我能想到两种解决方法。要么有两个单独的项目 - 一个生成动态生成构建的程序集,另一个项目引用和测试这些程序集。

另一个解决方法是使用Assembly.LoadFile和组件上的GetType(...)动态加载程序集和类型。然后你可以用Activator.CreateInstance实例化它,然后将对象强制转换为动态来访问它的属性和方法。

+0

我很高兴你这样说,因为我开始沿着这条路径与LoadFile交谈。关于它的好处是,我不必每次都删除程序集(尽管现在我应该考虑它了),并且我只关心使用公共属性生成的类,以便测试该部分应该是微不足道的。 –