2012-07-24 37 views
3

是否有可能使用Microsoft Fakes来隔离/替换类的构造函数?如何使用Microsoft Fakes Shim隔离(绕道)类的构造函数?

在找到的一个例子鼹鼠(假货先行者):http://thecurlybrace.blogspot.co.at/2011/11/how-do-i-detour-mole-type-constructor.html

我试图构建这样

ShimStreamReader.Constructor = @this => ShimStreamReader.ConstructorString(@this, "Test"); 

,但它说get访问丢失。为了澄清这将是很好,像这样

new StreamReader(new MemoryStream(Encoding.Default.GetBytes("33\r\n1\r\n16\r\n5\r\n7"))) 

因此静态输入,以取代类似

new StreamReader("filename") 

,我没有嘲笑读,的ReadLine等

回答

3

有可能通过反射来替换和调用不同的构造函数:

“因此,当您将一个常量你应该在构造函数中完成所有初始化。对于StreamReader构造函数可能不可行,因为您不知道对象是如何由原始构造函数进行内部初始化的,并且您无权访问对象的私有成员。 。

因此,我们可以使用反射原构造函数调用一起初始化的对象,然后用它” - 参见http://social.msdn.microsoft.com

维克拉姆Agrawals答案所以关于我的问题的代码是这样的:

ShimStreamReader.ConstructorString = (@this, value) => 
{ 
    ConstructorInfo constructor = typeof (StreamReader).GetConstructor(new[] {typeof (Stream)}); 
    constructor.Invoke(@this, new object[] {new MemoryStream(Encoding.Default.GetBytes("33\r\n1\r\n16\r\n5\r\n7"))}); 
}; 
3
using (ShimsContext.Create()) 
{ 
    ShimStreamReader.ConstructorString = 
     delegate(StreamReader @this, string @string) 
     { 
      var shim = new ShimStreamReader(@this); 
      shim.Read =() => 42; 
     }; 

    var target = new StreamReader("MeaningOfLife.txt"); 
    Assert.AreEqual(42, target.Read()); 
} 
+0

这不是excactly我想要什么,看我更新的问题。 – Dresel 2012-10-13 09:04:17

+0

你需要的是一个模拟的StreamReader,这是不是我们可以生成。你必须建立它。 – 2012-10-25 21:19:24

+0

我不知道你是什么意思是模拟StreamReader,但是可以绕过(或替换)Mo中的构造函数调用les(见上面的示例),我认为它可能在Fakes中可能。我尝试了不同的解决方案(比如将“新的StreamReader(”filename“)”调用放入方法中,并用“新的StreamReader(新的MemoryStream(Encoding.Default.GetBytes(”33 \ r \ n1 \ r \ n16 \ r \ n5 \ r \ n7“)))”,但通过构造函数Mocking/Replacing会更加优雅,因为那样我就不需要改变现有的代码。 – Dresel 2012-10-26 12:50:54

相关问题