0

次のテストがあります。

IUnityContainer unityContainer = MockRepository.GenerateStrictMock<IUnityContainer>();

unityContainer.Expect(c => c.IsRegistered<IServiceContainerRegistrar>()).Return(true).Repeat.Once();

私が知る限り、私は IUnityContainer のモックを作成しており、誰かがIsRegisteredメソッドを呼び出したときに何を返すかを彼に伝えています。

次の例外が発生します。

Test method CommonInitializerTest.CommonInitializer_Initialize_WorksOnce threw exception: 
System.InvalidOperationException: Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw.

次のスタックトレースを使用:

at System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source)
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container, Type typeToCheck, String nameToCheck)
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container, Type typeToCheck)
at Microsoft.Practices.Unity.UnityContainerExtensions.IsRegistered(IUnityContainer container)
at Drives.Services.Common.Tests.CommonInitializerTest.<CommonInitializer_Initialize_WorksOnce>b__0(IUnityContainer c) in CommonInitializerTest.cs: line 50
at Rhino.Mocks.RhinoMocksExtensions.Expect(T mock, Function`2 action)

したがって、Expect は実際のコードを呼び出しており、Unity で使用されるすべてをモックしていないため、失敗しています。RhinoMock が期待値を登録するときに実際のコードを実行するのはなぜですか?????

4

1 に答える 1

1

私の知る限り、静的拡張メソッドをモックする組み込みの方法はありません。これは Moq にも当てはまり、RhinoMock にも同じことが当てはまります。もちろん、ラッパーなどを作成することもできますが、組み込みの方法はないと思います。それがおそらく、実際の拡張メソッドをヒットするコードがスタブ化されている理由です。

public static bool IsRegistered<T>(this IUnityContainer container)
{
  Guard.ArgumentNotNull((object) container, "container");
  return UnityContainerExtensions.IsRegistered(container, typeof (T));
}

この関連記事も参照してください。

于 2013-11-12T09:38:47.960 に答える