2016-02-04 49 views
0

我正在爲用於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

爲了概括你的問題,你問的是如何最好的單元測試動態構建的程序集。難點在於,在您運行代碼生成代碼之前,所討論的程序集不存在,因此您無法引用程序集並靜態綁定它。

我能想到兩種解決方法。要麼有兩個單獨的項目 - 一個生成動態生成構建的程序集,另一個項目引用和測試這些程序集。

另一個解決方法是使用Assembly.LoadFile和組件上的GetType(...)動態加載程序集和類型。然後你可以用Activator.CreateInstance實例化它,然後將對象強制轉換爲動態來訪問它的屬性和方法。

+0

我很高興你這樣說,因爲我開始沿着這條路徑與LoadFile交談。關於它的好處是,我不必每次都刪除程序集(儘管現在我應該考慮它了),並且我只關心使用公共屬性生成的類,以便測試該部分應該是微不足道的。 –