19
class Parent{
   public string Name{ get; set; }
}

class Child :Parent{
   public string  address{ get; set; }
}

[TestClass]
class TestClass{
   [TestMethod]
   public void TestMethod()
   {
      var c = new Fakes.Child();
      c.addressGet = "foo"; // I can see that
      c.NameGet = "bar"; // This DOES NOT exists
   }
}

上記のコード サンプルで「名前」を設定するにはどうすればよいですか?

4

4 に答える 4

15

生成されたクラスにParentは、次のようなコンストラクターがありますShimParent(Parent p)

あなたがする必要があるのは次のとおりです。

var child = new ShimChild();
var parent = new ShimParent(child);

そして、それぞれのシムに適切な値を設定します。

于 2014-02-22T06:33:34.023 に答える
12

基本クラスで宣言する必要があります。最も簡単な方法は、基本クラスの AllInstances プロパティを呼び出すことです。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        ClassLibrary1.Child myChild = new ClassLibrary1.Child();

        using (ShimsContext.Create())
        {
            ClassLibrary1.Fakes.ShimChild.AllInstances.addressGet = (instance) => "foo";
            ClassLibrary1.Fakes.ShimParent.AllInstances.NameGet = (instance) => "bar";

            Assert.AreEqual("foo", myChild.address);
            Assert.AreEqual("bar", myChild.Name);
        }

    }
}

また、常に ShimsContext を追加して、シムが適切にクリーニングされるようにしてください。そうしないと、他の単体テストでも、以前に宣言した値が返されます。ShimsContext に関する情報は、http ://msdn.microsoft.com/en-us/library/hh549176.aspx#ShimsContext にあります

于 2013-03-26T08:29:18.240 に答える
2

以前の回答、Microsoft のドキュメント、および私自身の実験に基づいて解決策をまとめました。TestMethodまた、実際にテストに使用する方法を示すために少し変更しました。注: この特定のコードはコンパイルしていないため、そのままでは機能しない場合は申し訳ありません。

[TestClass]
class TestClass
{
   [TestMethod]
   public void TestMethod()
   {
      using (ShimsContext.Create())
      {
         Child child = CreateShimChild("foo", "bar");

         Assert.AreEqual("foo", child.address);  // Should be true
         Assert.AreEqual("bar", child.Name);     // Should be true
      }
   }

   private ShimChild CreateShimChild(string foo, string bar)
   {
      // Create ShimChild and make the property "address" return foo
      ShimChild child = new ShimChild() { addressGet = () => foo };

      // Here's the trick: Create a ShimParent (giving it the child)
      // and make the property "Name" return bar;
      new ShimParent(child) { NameGet = () => bar };

      return child;
   }
}

Name返された子が「バー」を返す必要があることをどのように知っているのかわかりませんが、そうです! ご覧のとおり、ShimParentどこでも保存する必要さえありません。プロパティの値を指定するためにのみ作成されNameます。

于 2015-06-18T21:02:19.150 に答える
0

私の意見では、これまでに提案されたアプローチはどれも機能しません。多くの試行錯誤の後、私のために働いた以下のコードを思いつきました。基本的に、子クラスを初期化するデリゲートを定義する必要があり、そのデリゲート内で、子クラスが継承する親の Shim を接続します。

public void TestMethod()
    {
        //var c = new Fakes.Child();
        //c.addressGet = "foo"; // I can see that
        //c.NameGet = "bar"; // This DOES NOT exists

        using (ShimsContext.Create())
        {
            ShimChild childShim = null;
            ShimChild.Constructor = (@this) =>
            {

                childShim = new ShimChild(@this);
                // the below code now defines a ShimParent object which will be used by the ShimChild object I am creating here
                new ShimParent()
                {
                    NameSetString = (value) =>
                    {
                        //do stuff here
                    },
                    NameGet = () =>
                    {
                        return "name";
                    }
                };
            };
        }
    }
于 2014-09-18T03:02:48.683 に答える