【问题标题】:How to Isolate (detour) constructor of class with Microsoft Fakes Shim?如何使用 Microsoft Fakes Shim 隔离(绕行)类的构造函数?
【发布时间】:2012-07-24 13:54:09
【问题描述】:

是否有可能用 Microsoft Fakes 隔离/替换类的构造函数?

找到 Mole(Fakes 的前身)的示例: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("filename")

像这样的静态输入

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

这样我就不必模拟 Read、ReadLine 等了。

【问题讨论】:

    标签: c# unit-testing microsoft-fakes


    【解决方案1】:
    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());
    }
    

    【讨论】:

    • 你想要的是一个模拟的 StreamReader。这不是我们可以产生的。你必须建造它。
    • 我不知道你对模拟 StreamReader 的意思,但它可能会绕道(或替换) Moles 中的构造函数调用(参见上面的示例),我认为它可能在 Fakes 中是可能的。我尝试了不同的解决方案(例如将“new StreamReader(”filename“)”调用放入一个方法中,并将整个方法替换为“new StreamReader(new MemoryStream(Encoding.Default.GetBytes(”33\r\n1\r\n16 \r\n5\r\n7")))",但通过构造函数模拟/替换来实现这一点会更优雅,因为这样我就不必更改现有代码。
    • 可以通过反射实现,请参阅下面我的 (Vikram Agrawals) 答案。
    【解决方案2】:

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

    “因此,当您替换构造函数时,您应该在构造函数中进行所有初始化。对于 StreamReader 构造函数可能是不可能的,因为您不知道原始构造函数如何在内部初始化对象并且您没有访问对象的私有成员。

    所以,我们可以使用反射来调用原始构造函数来初始化对象,然后使用它。” - 请参阅http://social.msdn.microsoft.com 上的 Vikram 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"))});
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多