Specflow - 使用 .NET Core 的 Microsoft 依赖注入导致 BoDi.ObjectContainerException

Posted

技术标签:

【中文标题】Specflow - 使用 .NET Core 的 Microsoft 依赖注入导致 BoDi.ObjectContainerException【英文标题】:Specflow - Using Microsoft Dependency Injection from .NET Core leads to BoDi.ObjectContainerException 【发布时间】:2019-08-23 15:39:45 【问题描述】:

我目前正在尝试使用 Speflow 设置一个新的 .NET Core 项目并将默认的 Microsoft 依赖注入连接到它。

在研究了文档和Autofac/Ninject 实现之后,我尝试实现自己的运行时插件“SpecFlow.MSDependencyInjection.SpecFlowPlugin”。

现在我正在努力解决 Specflow 特定的基础架构,例如 ScenarioContext。

    public static class DependencyInjectionExtension
    
        private static void RegisterSpecflowDependecies(IObjectContainer objectContainer, ServiceCollection serviceCollection)
        
            serviceCollection.AddSingleton(objectContainer);

            serviceCollection.AddSingleton((x) =>
            
                var specflowContainer = x.GetRequiredService<IObjectContainer>();
                var scenarioContext = specflowContainer.Resolve<ScenarioContext>();
                return scenarioContext;
            );

            serviceCollection.AddSingleton((x) =>
            
                var specflowContainer = x.GetRequiredService<IObjectContainer>();
                var scenarioContext = specflowContainer.Resolve<FeatureContext>();
                return scenarioContext;
            );

            serviceCollection.AddSingleton((x) =>
            
                var specflowContainer = x.GetRequiredService<IObjectContainer>();
                var scenarioContext = specflowContainer.Resolve<TestThreadContext>();
                return scenarioContext;
            );
        

        [ScenarioDependencies]
        public static IServiceProvider CreateServiceCollection(IObjectContainer objectContainer)
        
            var serviceCollection = new ServiceCollection();

            RegisterSpecflowDependecies(objectContainer, serviceCollection);

            var bindingAttributeClasses = typeof(DependencyInjectionExtension).Assembly.GetTypes()
                .Where(t => Attribute.IsDefined(t, typeof(BindingAttribute))).ToArray();

            foreach (var bindingAttributeClass in bindingAttributeClasses)
            
                serviceCollection.AddSingleton(bindingAttributeClass);
            

            return serviceCollection.BuildServiceProvider();
        
    

当 Specflow 尝试解析我的一个绑定时,我收到以下异常:

BoDi.ObjectContainerException: 'Primitive types or structs cannot be resolved: System.String (resolution path: TechTalk.SpecFlow.ScenarioContext->TechTalk.SpecFlow.ScenarioInfo)'

RegisterSpecflowDependecies 的代码与Autofac 的实现非常相似。所以我不明白为什么它在我的实现中不起作用。

【问题讨论】:

您找到解决问题的方法了吗? 【参考方案1】:

似乎其中一个构造函数有一个字符串参数。

您可以将该构造函数包装在另一个以另一种方式获取参数的类中:

class MyWrapper : ClassThatHasAStringParameter

    public MyWrapper()
       : base("PARAMETER_VALUE")
    
    

【讨论】:

据我了解,Specflow 处理自己的依赖项。所以我不太确定必须在 ScenarioContext 中插入哪些值,因为它是 Specflow 依赖项。这就是为什么我使用应该能够解决它的特定 Specflow Objectcontainer。至少我是这么认为的……长话短说,我不知道预期的字符串是什么。

以上是关于Specflow - 使用 .NET Core 的 Microsoft 依赖注入导致 BoDi.ObjectContainerException的主要内容,如果未能解决你的问题,请参考以下文章

在 VSCode 中将 SpecFlow 测试添加到 .NET Core 项目

SpecFlow 测试无法使用 Playwright.NET 运行

[C#.NET][SpecFlow] 使用 Scenario Outline 执行多次验证

SpecFlow测试平台是否支持异步任务?

不会自动化UI测试?不会编程?没问题,会造句就行!

SpecFlow:ClassInitialize 和 TestContext