1

BaseClassなどの基本クラスから継承するDerivedClassなどのクラスがあります。BaseClassは、IBaseClassと呼ばれるインターフェイスを実装します。IBaseClassには、整数の自動プロパティであるTestPropertyと呼ばれる1つのプロパティがあります。

私はPartialMultiMockDerivedClassのように:

derivedClassMock = repository.PartialMultiMock<DerivedClass>(typeof(IBaseInterface));

次に、次のように期待値を設定します。

derivedClassMock.Expect(d => d.TestProperty).Return(141);

しかし、私は次の例外を受け取り続けます:

「無効な呼び出し、最後の呼び出しが使用されたか、呼び出しが行われていません(仮想(C#)/オーバーライド可能(VB)メソッドを呼び出していることを確認してください)。」

BaseClassのTestPropertyの実装を仮想としてマークすると、すべてが機能しますが、なぜこれが必要なのかを理解しようとしています。DerivedClassがIBaseInterfaceを実装している場合、部分的なモック機能を取得するために仮想としてマークする必要はありません。(少なくとも私はそうではないと思います-私が間違っている場合は私を訂正してください)

次に、もう少し進んで、マルチモックをIBaseInterfaceにキャストし、次のように期待値を設定しようとしました。

var derivedInterface = (IBaseInterface) derivedClassMock;
derivedInterface.Expect(d => d.TestProperty).Return(1);

このテストは例外なく実行されるようになりましたが、TestPropertyから返される値は期待どおり1ではなく、0、つまりintのデフォルト値です。これは、スタブに似た動作を私に示唆しています。

私が混乱しているので、可能であれば、誰かがこれをもう少しよく理解するのを助けるために説明できますか?継承されたインターフェースを持つクラスを部分的にマルチモックすることはできませんか?インターフェースに期待値を設定すると、スタブのような動作が見られるのはなぜですか?

前もって感謝します。

4

1 に答える 1

4

私は実際にPartialMultiMockを使用していませんが、この場合、自動プロパティとして「TestProperty」を実装しているDerivedClassの戻り値をスタブ化しようとしているようです。これはセッターを使用した自動プロパティであるため、このプロパティのスタブはまったく必要ないように思われます。

あなたがした場合はどうなりますか?

var derivedClassMock = MockRepository.GenerateStub<DerivedClass>();
derivedClassMock.TestProperty = 146;
于 2009-10-01T18:21:14.980 に答える