0

たとえば、2つのプロパティを持つインターフェイスSomeClassを実装するクラスがあります(セッターはありません!!!そして依存します):ISomeInterfaceProp1Prop2Prop1Prop2Prop1

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?私はそれらがプライベートであるため、フィールドに必要な値を設定することはできません。私はモックするべきですISomeInterfaceConfigurationManagerConfigurationManagerもしそうなら、それがインターフェースを持っていない場合、どうすればモックできますか?ConfigurationManagerクラスを直接モックする必要がありますか?それは正しいでしょうか?また、どうすればモックできるのかわかりませんISomeInterfaceprop2に依存するテストが必要prop1です。私がタイプした場合:

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

        ...
    }

になるので、何も変わりませmoqSettings.Object.Prop2null。そして、よくわかりませんが、そうするのは間違っていると思います)))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 に答える