我怎么能伪造Assembly.LoadFile和Assembly.GetTypes?

时间:2015-02-20 10:02:53

标签: c# unit-testing visual-studio-2013 microsoft-fakes

我正在努力伪造这两行代码:

Assembly asm = Assembly.LoadFile(fileName);
Type[] asmTypes = loggerAssembly.GetTypes();

当我输入System.Reflection.ShimAssembly时,没有ShimAssembly这样的类型,例如在System.IO.ShimFile但只有StubAssembly的情况下。

我可以重构代码并使用像LoadAssemblyAndGetTypes这样的静态辅助方法来完成它,但它似乎是一个不必要的解决方法。我更喜欢官方解决方案。

如果它只是这样工作:

var shimAsm = System.Reflection.Fakes.ShimAssembly.LoadFile = (fileName) => 
{ 
   return ???
}; 

var types = shimAsm.GetTypes = () => 
{ 
   return new Type[] { new object() };
};

为什么它适用于System.IO.File而不适用于System.Reflection.Assembly。这是因为Assembly是一个抽象类吗?


在我的单元测试中,我想检查我的程序集加载程序是否正确检查加载的程序集是否包含实现某些接口的类型,以便稍后可以实例化它们。

1 个答案:

答案 0 :(得分:4)

我想我找到了答案并且看起来不太好:

@Patrick Tseng - Visual Studio团队 - 在Shim mscorlib and system limitations写道:

  

...我们有一个我们故意不允许它们的类型列表   匀。原因是它可能导致重新判断   从CLR运行时本身调用您的绕行委托。例如,如果CLR   运行时在运行期间使用System.Reflection中的类型,你就会发生   绕道这种类型的功能。你可能最终导致预期   因为运行时行为将完全改变。

     

简而言之,我们不提取值类型System.Reflection。,   System.Runtime。,XamlGeneratedNamespace以及其他一些类型   我们认为这很重要,不会给它们带来冲击。

所以看起来我似乎需要保持静态辅助方法。