【问题标题】:How to Test Drive building a dynamic assembly如何试驾构建动态装配
【发布时间】:2016-02-04 01:03:14
【问题描述】:

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

那么这是正确的方法吗?我会这样做吗?

【问题讨论】:

    标签: c# tdd linqpad dynamic-assemblies


    【解决方案1】:

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

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

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

    【讨论】:

    • 我很高兴你这么说,因为我开始沿着你所说的 LoadFile 路径走下去。这样做的好处是我不必每次都删除程序集(尽管我现在想起来可能应该这样做),而且我只关心使用公共属性生成的类,因此测试该部分应该微不足道。
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2016-12-11
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多