2016-06-28 2 views
1

私は単純なユニットテストパターンを設計し、moqライブラリを使用しました。しかし、Container.Resolve<IInterface>()メソッドを実行すると例外がスローされます。以下は、城ウィンザーの登録方法であってIoCCore.Container.Resolve< ISampleDataContext>();を実行中ターゲットレスプロキシであると思われるため、コンポーネントのレイトバウンドにコミッション懸念を適用できません。現在はサポートされていません

container.Register(Component.For<TBase>().UsingFactoryMethod(() => 
{ 
    var mockObject = new Mock<TBase>(); 
    var mockType = typeof(TBase); 

    if (container is Core.IoCContainer.IoCCore.CustomContainer) 
    { 
     var resolvingDelege = (container as Core.IoCContainer.IoCCore.CustomContainer).ResolvingTestDelegateList[mockType]; 

     if (resolvingDelege != null) 
     { 
      resolvingDelege(mockType, mockObject); 
     } 
    } 

    return mockObject.Object; 
}) 
.LifestyleTransient()); 

、例外がスローされています。例外メッセージは、 "コンポーネントの遅延バウンドData.Context.ISampleDataContextに手数料に関する懸念を適用することはできません。なぜなら、ターゲットレスプロキシと思われるからです。現在はサポートされていません。

私は問題を調査し、mockObject.ObjectCastle.DynamicProxy.IProxyTargetAccessorであることを発見しました。問題が発生した場合従って、インスタンスを解決しながらは次いでCastle.MicroKernel.ComponentActivator.AbstractComponentActivatorクラスに以下のコードは次のとおり

protected virtual void ApplyCommissionConcerns(object instance) 
    { 
     if (Model.Lifecycle.HasCommissionConcerns == false) 
     { 
      return; 
     } 

     instance = ProxyUtil.GetUnproxiedInstance(instance); 
     if (instance == null) 
     { 
      // see http://issues.castleproject.org/issue/IOC-332 for details 
      throw new NotSupportedException(string.Format("Can not apply commission concerns to component {0} because it appears to be a target-less proxy. Currently those are not supported.", Model.Name)); 
     } 
     ApplyConcerns(Model.Lifecycle.CommissionConcerns, instance); 
    } 

UsingFactoryMethodによって解決されているオブジェクトは、モックオブジェクトによって作成されCastle.DynamicProxy.IProxyTargetAccessor、です。しかし、Castle WindsorはIProxyTargetAccessorがmockオブジェクトの代わりに単独で作成されていると仮定しています。これにより、私の模擬インスタンスから空のインスタンスCommissionConcernsが返されます。

このバグの回避策はありますか?私は更新を待つべきですか?

答えて

0

私はこの問題の回避策を開発しました。私は以下のコードの代わりにUseFactoryMethodメソッドを変更しました

Component.For<TBase>().UsingFactoryMethod(() => 
      { 
       var mockObject = new Mock<TBase>(); 
       var mockType = typeof(TBase); 

       if (container is Core.IoCContainer.IoCCore.CustomContainer) 
       { 
        var resolvingDelege = (container as Core.IoCContainer.IoCCore.CustomContainer).ResolvingTestDelegateList[mockType]; 

        if (resolvingDelege != null) 
        { 
         resolvingDelege(mockType, mockObject); 
        } 
       } 

       //The code that was changed 
       //============================================== 
       var type = mockObject.Object.GetType(); 
       var field = type.GetField("__target"); 

       field.SetValue(mockObject.Object, new Object()); 
       //============================================== 

       return mockObject.Object; 
      }) 
      .LifestyleTransient()); 
関連する問題