3

テストでモックしたいクラスがあります。これはそのインターフェイスの一部です。

interface IInventory
{
    Instrument[] GetAllInstrumentsAffectedByFixSide(int fixSideNumber);

    bool IsRegistered<T>(string name, int? fixSideNumber) where T : InventoryObject;
}

私の記録は次のようになります。

using (mockRepository.Record())
{
    inventory.GetAllInstrumentsAffectedByFixSide(0);
    LastCall.Return(new Instrument[0]);

    inventory.Expect(x => x.IsRegistered<TestInstrument>("ActivatorInstrument", null)).IgnoreArguments().Return(true)
}

しかし、テスト対象のコードでこれを書くと:

TestHandler.Inventory.IsRegistered<TestInstrument>("ActivatorInstrument", null)

InvalidOperationException をスローします。この例外をスローする場所は興味深いです-それはですMethodInfo.GetGenericMethodDefinition()

そのソースは次のようになります。

public override MethodInfo GetGenericMethodDefinition()
{
    if (!IsGenericMethod)
        throw new InvalidOperationException();
    Contract.EndContractBlock();

    return RuntimeType.GetMethodBase(m_declaringType, RuntimeMethodHandle.StripMethodInstantiation(this)) as MethodInfo;
}

したがって、このメソッドは実際にはジェネリック メソッドではなく呼び出されます。内部にブレークポイントを配置し、この methodInfo が何であるかを確認したところ、実際にはIsRegistered<>メソッドではないことがわかりましたGetAllInstrumentsAffectedByFixSide

Rhino が forのモックコール内でGetGenericMethodDefinitionfor メソッドを呼び出そうとするのはなぜですか? コールは以前に発生しました。これら2つの方法を混同しているようです。GetAllInstrumentsAffectedByFixSideIsRegistered<>GetGenericMethodDefinition

スタックトレース:

at System.Reflection.RuntimeMethodInfo.GetGenericMethodDefinition()
at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.MethodsEquals(MethodInfo method, ProxyMethodExpectationTriplet triplet)
at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.GetAllExpectationsForProxyAndMethod(Object proxy, MethodInfo method)
at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.CalcExpectedAndActual.Calculate(Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.CalcExpectedAndActual..ctor(UnorderedMethodRecorder parent, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.UnexpectedMethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoGetRecordedExpectation(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetRecordedExpectation(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.Impl.ReplayMockState.DoMethodCall(IInvocation invocation, MethodInfo method, Object[] args)
at Rhino.Mocks.Impl.ReplayMockState.MethodCall(IInvocation invocation, MethodInfo method, Object[] args)
at Rhino.Mocks.MockRepository.MethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.Impl.RhinoInterceptor.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at IInventoryProxy4a132be1cb07441cafba3f828d3ced66.IsRegistered[T](String name, Nullable`1 fixSideNumber)
at TestHandlerLibrary.DummyFixSideHandler.DoInitialization() in \RTX.Test.TestGear.DummyTestHandlerLibrary\DummyFixSideHandler.cs:line 87

Upd私は質問で間違いを犯しました:私は実際に期待を次のように設定しました:

inventory.Expect(x => x.IsRegistered<TestInstrument>("ActivatorInstrument", null)).IgnoreArguments().Return(true);

それを.ExpectなしでLastCallを使用して直接セットアップに変更すると、実際に機能します。何かご意見は?問題を反映するために、上記のコードを変更しました。

4

1 に答える 1