如何测试驱动器构建动态装配

时间:2016-02-04 01:03:15

标签: c# tdd linqpad dynamic-assemblies

我正在为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)
    }
}

这是正确的做法吗?这是我怎么做的?

1 个答案:

答案 0 :(得分:1)

要概括您的问题,您要问的是如何最好地对动态构建的程序集进行单元测试。困难在于,在您运行代码生成代码之前,有问题的程序集不存在,因此您无法引用程序集并静态绑定它。

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

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