如何试驾构建动态程序集
How to Test Drive building a dynamic assembly
我正在为 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 实例化它,然后将对象转换为 dynamic 以访问它的属性和方法。
我正在为 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 实例化它,然后将对象转换为 dynamic 以访问它的属性和方法。