【问题标题】:Can't create Mole for System.Environment class无法为 System.Environment 类创建 Mole
【发布时间】:2011-08-17 15:08:31
【问题描述】:

我想在我的单元测试中替换 Environment.GetFolderPath 的行为,但是在为 System 程序集生成痣之后,System.Moles 程序集不包含 MEnvironment 类型的定义。

【问题讨论】:

    标签: moles pex-and-moles


    【解决方案1】:

    您是否尝试过在接口类型中存根? sub 可以通过构造函数注入或方法输入参数传入。例如,创建接口IEnvironment,包括GetFolderPath 方法。如果您已经知道如何执行此操作,请随时继续。否则,下面将演示如何在 Environment 类中存根。 (我在手机上输入这个,所以请耐心等待;)

    public interface IEnvironment
    {
      string GetFolderPath(Environment.SpecialFolder folder);
    }
    

    接下来,创建一个存根:

    public class MyEnvironment : Environment, IEnvironment
    { 
      public string GetFolderPath(Environment.SpecialFolder folder)
      {
        return base.GetFolderPath(folder);
      }
    }
    

    将存根作为参数传递给您的方法或类构造函数:

    public void MyMethod(IEnvironment env)
    {
      var path = env.GetFolderPath():
    }
    

    为了测试,创建一个 mock 类型,或 moole MyEnvironment.GetGolderPath。出于性能原因,创建模拟比创建模拟类型更可取。模拟只是返回一个值而不是调用基方法,就像摩尔类型一样。无论哪种方式,他的存根都是必要的,因此您不妨制作模拟,因为它可以重复用于其他测试。

    【讨论】:

    • 但是我的生产代码没有设置环境实例的能力。它可以在没有 Moles 的情况下完成,使用 Moq 或其他任何东西。
    • 我不希望您的代码已经存根 Environment 类,这就是为什么我建议重构一个。而且,是的,它当然可以而且应该在没有 Moles 的情况下完成。存根的目的是提供将模拟类型传递给测试代码的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2013-01-27
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多