2017-09-22 62 views
1

我们使用Unity作为我们的依赖注入框架。在SpecFlow步骤文件中使用依赖注入

我想创建一个验收测试并需要一个DossierService实例。
不幸的是,我得到以下异常:

BoDi.ObjectContainerException: '界面不能得到解决[...]'

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

    public DossierServiceSteps(IDossierService dossierService) 
    { 
     this.dossierService = dossierService; 
    } 
} 
  • 到底是什么博迪?我找不到任何有用的信息..
  • 如何告诉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实例解析器:

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

CastleWindsorBindingInstanceResolver我们需要实现一个方法:object ResolveBindingInstance(Type bindingType, IObjectContainer scenarioContainer);。这个类包含容器和分辨率(在你的case实例中为IUnityContainer,我建议注入到self的容器实例中,这样你可以注入IUnityContainer实例到SpecFlow绑定类)

这个插件需要分开组装并将其加载到测试项目中,如下所示调整app.config

<specFlow> 
    <plugins> 
     <add name="PluginAssemblyName" path="." type="Runtime" /> 
    </plugins> 
... 
</specFlow>