1

コンストラクターにデフォルトのパラメーターを持つ抽象クラスを Moq したいと思います。これは、デフォルトが設定されていることをテストしたり、特定の値をテストしたりできるようにするためです。例(注、これは純粋にサンプルクラスです)

public abstract class AbstractClassToTest
  {
      private string _name;
      private int _someInt;
      private int _anotherInt;

      public AbstractClassToTest(string name, int someInt = 10, int anotherInt = 20)
      {
          _name = name;
          _someInt = someInt;
          _anotherInt = anotherInt;
      }
  }

Moq オブジェクトを次のようにセットアップします。

var act = new Mock<AbstractClassToTest>(MockBehavior.Loose, "namestring");

しかし、これはエラーをスローします...

Message "Can not instantiate proxy of class:
Test.AbstractClassToTest.
Could not find a constructor that would match given arguments:
System.String
Parameter name: constructorArguments"

オブジェクトを moq で作成し、デフォルトのままにするにはどうすればよいですか?

Moq: v 4.0.10827.0

4

1 に答える 1

2

Moq はクラス タイプをモックせず、インターフェイスのみをモックします。おそらく、抽象クラスでさえ、多くの「具体的な」実装と多くの状態を持つ可能性があるためです。

代わりに、独自のモック クラスを作成します。

class AbstractClassToTestMOCK : AbstractClassToTest
{
  internal AbstractClassToTestMOCK(string name, int someInt = 10, int anotherInt = 20)
    : base(name, someInt, anotherInt)
  {
  }
}

編集:

私の元の回答の最初の段落はすべて間違っていました。問題のインスタンス コンストラクpublicターがまたは(または) ですpublic。その後、または であるすべての( を含む) メソッド (およびプロパティ、インデクサーなど) を使用できます。publicprotectedprotected internalSetupvirtualabstractpublicprotected

元の質問に戻ると、問題は単純に、名前付きおよびオプションの引数が一種の構文糖衣であり、リフレクションによって十分にサポートされていないことです。

元の を変更することが許可されている場合、AbstractClassToTestこの問題を回避する別の方法は、インスタンス コンストラクターをオーバーロードすることです。つまり、これを元のクラスに追加します。

protected AbstractClassToTest(string name)
    : this(name, someInt: 10, anotherInt: 20)
{
}

その場合、(元のコンストラクターの)パラメーターをオプションのままにしたい場合と、したくない場合があります。

PS!クラスのインスタンス コンストラクターは であってabstractはなりませんpublicprotected代わりに使用してください。

于 2012-12-23T07:00:47.830 に答える