1. ホーム
  2. unit-testing

[解決済み] MOQ - 別のインターフェースにキャストする必要があるインターフェースをどのようにモックするか?

2023-07-01 13:07:24

質問

I1 のモックを作成したいのですが、これは問題ありません。しかし、このモックを使用するメソッドをテストする過程で、I1 にはないいくつかのプロパティにアクセスするために、I2 にキャストする必要があります。

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 の両方を同時に継承するように強制するにはどうすればよいかということです。

どのように解決するのですか?

私の理解では、あなたは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 メソッドに、モック自身を返す期待値を設定すればよいのです。