0

例如,我有一个SomeClass类,它实现ISomeInterface了具有两个属性的接口Prop1并且Prop2Prop1没有设置器!!!并且Prop2依赖于Prop1):

public class SomeClass : ISomeInterface
    {
        private readonly NameValueCollection settings = ConfigurationManager.AppSettings;
        private readonly string p1;
        private string p2;

        public string Prop1 { get { return settings["SomeSetting"]; } }
        public string Prop2
        {
            get
            {
                switch(Prop1)
                {
                    case "setting1": return "one";
                    case "setting2": return "two";
                    case "setting3": return "three";
                    default: return "one";
                }
            }
            set { p2 = value; }
        }
    }

我需要为这个类编写单元测试。我建议他们应该看起来像:

[TestMethod]
public void Prop2ShouldReturnOneValueIfSomeSettingEqualsSetting1()
{
    var someClass = new SomeClass();
    Assert.Areequals(someClass.Prop2, "one");
}

[TestMethod]
public void Prop2ShouldReturnTwoValueIfSomeSettingEqualsSetting2()
{
    var someClass = new SomeClass();
    Assert.Areequals(someClass.Prop2, "two");
}

所以我的问题是:How can I force Prop1 return setting1, setting2 etc. if it has no setter?我无法为字段设置我需要的值,因为它们是私有的。我应该嘲笑ISomeInterface还是ConfigurationManager???ConfigurationManager如果是这样,如果它没有接口,我该如何模拟???我应该直接模拟ConfigurationManager类吗???会不会对???我也不明白我怎么能嘲笑ISomeInterface。我需要测试prop2取决于prop1. 如果我输入:

[TestMethod]
public void Prop2ShouldReturnTwoValueIfSomeSettingEqualsSetting2()
    {
        var moqSettings = new Mock<ISomeInterface>();
        moqSettings.Setup(p => p.Prop1).Returns("setting2");

        ...
    }

它不会改变任何东西,因为moqSettings.Object.Prop2将会null。而且,我不确定,但我认为这样做是错误的)))So how can I test all cases in prop2???

PS为了模拟我使用Moq. PPS 对不起我的英语)))我希望我清楚地解释了我需要什么......

4

1 回答 1

1

我认为您的班级有几个职责 - 读取配置,并根据配置设置生成一些值。如果您拆分这些职责,那么您可以模拟您的应用程序设置。创建一些界面,例如ISomeConfiguration

public interface ISomeConfiguration
{
    string SomeSetting { get; }
}

以这种方式实现它:

public class MyConfiguration : ISomeConfiguration
{
    readonly NameValueCollection settings = ConfigurationManager.AppSettings;

    public string SomeSettings
    {
        get { return settings["SomeSetting"]; }
    }
}

并将此接口注入您的SomeClass

public class SomeClass : ISomeInterface
{
   private readonly string p1;
   private string p2;
   private ISomeConfiguration config;

   public SomeClass(ISomeConfiguration config)
   {
       this.config = config;
   }

   public string Prop1 { get { return config.SomeSetting; } }
   public string Prop2
   {
       get
       {
          switch(Prop1)
          {
              case "setting1": return "one";
              case "setting2": return "two";
              case "setting3": return "three";
              default: return "one";
          }
       }
       set { p2 = value; }
  }

}

现在您可以毫无问题地模拟您的配置:

[TestMethod]
public void Prop2ShouldReturnTwoValueIfSomeSettingEqualsSetting2()
{
    var moqConfig = new Mock<ISomeConfiguration>();
    moqConfig.Setup(p => p.SomeSetting).Returns("setting2");
    var sut = new SomeClass(moqConfig.Object);
    Assert.That(sut.Prop2, Is.EqualTo("two"));
}
于 2012-07-12T14:17:52.607 回答