0

MVC タービンから派生したサイトでブレード ユニット テストを設定しようとしています。IServiceLocator問題は、次の例外にヒットせずにインターフェイスをモックできないように見えることです。

System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at System.Reflection.Emit.TypeBuilder._TermCreateClass(Int32 handle, Module module)
at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
at System.Reflection.Emit.TypeBuilder.CreateType()
at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType()
at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType()
at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options)
at Castle.DynamicProxy.DefaultProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors)
at Rhino.Mocks.MockRepository.MockInterface(CreateMockState mockStateFactory, Type type, Type[] extras)
at Rhino.Mocks.MockRepository.CreateMockObject(Type type, CreateMockState factory, Type[] extras, Object[] argumentsForConstructor)
at Rhino.Mocks.MockRepository.Stub(Type type, Object[] argumentsForConstructor)
at Rhino.Mocks.MockRepository.<>c__DisplayClass1`1.<GenerateStub>b__0(MockRepository repo)
at Rhino.Mocks.MockRepository.CreateMockInReplay<T>(Func`2 createMock)
at Rhino.Mocks.MockRepository.GenerateStub<T>(Object[] argumentsForConstructor)
at XXX.BladeTest.SetUp()

このエラーに関して検索すると、32 ビット対 64 ビットの DLL コンパイルの問題が発生しますが、MVC Turbine はあらゆる場所でサービス ロケーター ファサードを使用しており、Rhino モックを使用してモックしようとしただけで、他の問題は発生していません。 .

この NUnit セットアップ メソッドの 2 行目で爆発します。

IRotorContext _context;
IServiceLocator _locator;

[SetUp]
public void SetUp()
{
    _context = MockRepository.GenerateStub<IRotorContext>();
    _locator = MockRepository.GenerateStub<IServiceLocator>();
    _context.Expect(x => x.ServiceLocator).Return(_locator);
}

ちょっと脇に置いておきます。IServiceLocator型登録メソッドの呼び出しを追跡できると考えて、偽の implementation を実装しようとしました。タイプが Unity ベースでない場合、登録ロジックが呼び出されないようにサービス ロケーターのインターフェイスを拡張するため、これはセットアップでは機能しません。

4

2 に答える 2

1

はい、Turbine のランタイムもテストしているときに、RhinoMocks で同じ問題に遭遇しました。言いたくないのですが、必要な場所に IServiceLocator の独自の偽物を提供することで問題を回避しましたが、説明したように、それはできません。:(

「タイプがUnityベースでない場合」というあなたの質問から、私はこの作品に従っていません??

于 2010-02-24T15:41:28.303 に答える
1

これは Moq v4.0 ベータ版で修正されています。この問題は、Castle DynamicProxy 2.1 で、一般的な制約を持つインターフェイスの動的プロキシを作成するときに発生しました。

http://code.google.com/p/moq/issues/detail?id=177

于 2010-06-17T23:45:01.750 に答える