web-dev-qa-db-ja.com

MOQ-別のインターフェイスにキャストする必要があるインターフェイスをモックする方法は?

私がやりたいのはI1のmoqを構築することです-これは問題ありません...しかし、このモックを使用してテストしている方法の過程で、オンではないプロパティにアクセスするためにI2にキャストする必要がありますI1

Interface I1 
{ int AProperty{get;set;}}

Interface I2
{int AnotherProperty{get;set;}}

その後、いくつかのオブジェクトがあります

Class O1 : I1 {}

そして

Class O2 : O1 , I2 {}

問題は、I2を実装するオブジェクトのインスタンスがある場合、そのインターフェイスを介して実装されるメソッドにアクセスするためにI1にキャストできることです。コードではこれは問題ではなく、すべてが正常に機能します。

唯一の問題は、そのクラスで単体テストを作成するときに発生します。

インターフェースは、GetNewInstanceと呼ばれるメソッドも公開します。このメソッドは、IGetNewInstanceインターフェースにキャストされた実装オブジェクトの初期化されたインスタンスを返します。

ただし、この返されたI2型のオブジェクトをI1にキャストしようとすると、null参照が発生します。これは、I2を実装するモックオブジェクトがI1を継承するものから継承しないためです。

問題は、I1とI2の両方から同時にモックオブジェクトを強制的に継承させるにはどうすればよいですか?

65
John Nicholas

私の理解では、2つのインターフェイスを実装するモックを作成します。 Moqでは、これは次のように簡単です。

var mock = new Mock<IFoo>(); // Creates a mock from IFoo
mock.As<IBar>(); // Adds IBar to the mock
mock.As<IBar>().Setup(m => m.BarMethod()).Returns(new object()); // For setups.

これで、通常IFooIBarの両方を実装するオブジェクトを使用するのと同じように、期待を設定してモックを使用できます。

GetNewInstanceメソッドの場合、モック自体を返す期待値を設定するだけです。

112
Håvard S