2013-10-17 47 views
1

我正在寫一個用於測試的方法如下:如何測試使用Activator.CreateInstance(...)的方法?

public IAnInterface Instantiator() 
{ 
    var type = Type.GetType(A_CONSTANT_STRING); 
    return (IAnInterface)Activator.CreateInstance(type); 
} 

當測試正在運行時,從Type.GetType(...)方法獲得的類型爲null。我的問題是:

  1. null正在返回,因爲不是所有的類型都加載(?)執行測試時?
  2. 如何克服這個問題?其實我想測試是否已經返回了所需的類型。

在此先感謝

回答

0

通過將參考其中在A_CONSTANT_STRING指定類型所在的項目解決。

-1

在定義什麼是彙編你喜歡的類型?假設你的方法是在相同的組件,你正在尋找的類型,請嘗試:

var type = Assembly.GetExecutingAssembly().GetTypes() 
    .First(t => t.Name == A_CONSTANT_STRING); 

return (IAnInterface)Activator.CreateInstance(type); 
+0

其實我無法修改正在測試的代碼。 – JPCF

+0

我不是建議你這樣做。我只是假設你更喜歡簡單,你可能會在同一個程序集中運行你的測試。如果你不是,你仍然想引用你想要查找類型的程序集... – oerkelens

0
var type = Type.GetType("namespace.qualified.TypeName"); 
+0

其實我無法修改正在測試的代碼 – JPCF

1

正如@Krekkon已經提到Type.GetType()方法需要以下字符串:

類型的程序集限定名稱來獲得。請參閱AssemblyQualifiedName。如果該類型位於當前正在執行的程序集或Mscorlib.dll中,則只需提供由其名稱空間限定的類型名即可。

對於問題2:由於靜態調用Type.GetType(),您將無法測試該類型是否已返回。如果你可以改變你的代碼可以引入一個接口,負責類型解析和代表靜態的GetType方法調用的門面:

interface ITypeResolver 
{ 
    Type GetType(string typeName); 
} 

class SomeClass 
{ 
    private readonly ITypeResolver typeResolver = ...; 

    public IAnInterface Instantiator() 
    { 
    var type = this.typeResolver.GetType(A_CONSTANT_STRING); 
    return (IAnInterface)Activator.CreateInstance(type); 
    } 
} 

使用你能嘲笑ITypeResolver並在測試執行的接口ITypeResolver接口在隔離中。