2017-09-22 13 views
1

私たちは依存性注入フレームワークとしてUnityを使用しています。SpecFlowのステップファイルで依存性注入を使用する

受け入れテストを作成し、DossierServiceのインスタンスが必要です。
は、残念ながら、私は次の例外を取得:

BoDi.ObjectContainerException: 'インターフェイスが解決することはできません[...]'

[Binding] 
public class DossierServiceSteps : BaseSteps 
{ 
    private IDossierService dossierService; 

    public DossierServiceSteps(IDossierService dossierService) 
    { 
     this.dossierService = dossierService; 
    } 
} 
  • Bodiのは正確には何ですか?役に立つ情報が見つかりません。
  • SpecFlowに通常のUnityコンテナを使用するように指示するにはどうすればよいですか?

事前に感謝

編集:私はのようなSpecFlow.Unityを使用して試した はそう:

public static class TestDependencies 
{ 
    [ScenarioDependencies] 
    public static IUnityContainer CreateContainer() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 

     container.RegisterTypes(typeof(TestDependencies).Assembly.GetTypes().Where(t => Attribute.IsDefined(t, typeof(BindingAttribute))), 
      WithMappings.FromMatchingInterface, 
      WithName.Default, 
      WithLifetime.ContainerControlled); 

     return container; 
    } 
} 

UnityConfigで種類が正しく

container.RegisterType<IDossierService, DossierService>(new InjectionConstructor(typeof(IDataService), typeof(IDossierRepository), typeof(IDbContext), true)); 

しかし、私が登録されていますまだ同じ例外を得るに。 CreateContainer()メソッドの開始時にブレークポイントを設定すると、TestDependenciesはブレークしません。

答えて

1

SpecFlow RuntimePluginを実装することでこの問題を解決しました。私たちの場合、Castle.Windsorでしたが、原則は同じです。まず、あなたがプラグインを定義するオーバーライドデフォルトSpecFlowインスタンスリゾルバ:object ResolveBindingInstance(Type bindingType, IObjectContainer scenarioContainer);CastleWindsorBindingInstanceResolverに我々は、単一のメソッドを実装するために必要な

public class CastleWindsorPlugin : IRuntimePlugin 
{ 
    public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters) 
    { 
     runtimePluginEvents.CustomizeScenarioDependencies += (sender, args) => 
     { 
      args.ObjectContainer.RegisterTypeAs<CastleWindsorBindingInstanceResolver, IBindingInstanceResolver>(); 
     }; 
    } 
} 

。このクラスにはコンテナと解像度が含まれています(ケースIUnityContainerの場合は、IUnityContainerのインスタンスをSpecFlowバインディングクラスに挿入できるように、selfのコンテナインスタンスに注入することをお勧めします)

このプラグインは別途必要ですあなたはこのようにapp.configを調整するようにテストプロジェクトにロードします:

<specFlow> 
    <plugins> 
     <add name="PluginAssemblyName" path="." type="Runtime" /> 
    </plugins> 
... 
</specFlow> 
関連する問題