【问题标题】:BoDi.ObjectContainerException : Interface cannot be resolved in Specflow testBoDi.ObjectContainerException:在 Specflow 测试中无法解析接口
【发布时间】:2021-05-27 10:53:38
【问题描述】:

我在Specflow 测试中有这一步:

[Then(@"the enriched messages are written to the LC")]
public void ThenTheEnrichedMessagesAreWrittenToTheLC()
{
    var LcApplicationOptions = new LcApplicationOptions();
    _configuration.GetSection("LcApplication").Bind(LcApplicationOptions);
    Subscription sub = new Subscription(LcApplicationOptions.LcVendor, LcApplicationOptions.LcInstrument);
    MessageConsumer consumer = new NetMessageConsumer();
    // If Client throws an exception via ctor then it probably cant find Config\Fields.json
    using (Client c = new Client(LcApplicationOptions.LcHost, _loggerClient, _fieldDictionary, _subscriptionIdGenerator, _iLifetimeScope))
    {
        int subscriptionId;

        c.OnConnected += Client_OnConnected;
        c.OnClosed += Client_OnClosed;

        // Register the subscription which will connect to LC and login first.
        // Any updates for this instrument will be handled by "consumer".
        subscriptionId = c.Register(sub, LcApplicationOptions.LcAuthToken, consumer);

        // The subscriptionId is also reflected in sub.Id after the call.
        Console.WriteLine("hit enter...");
        //Console.ReadLine();

        // You can unsubscribe like this
        c.Unregister(sub.Id);
    }
}

当我运行它时,我得到了这个错误:

[xUnit.net 00:02:31.22] System.ArgumentNullException:值不能为空。 (参数“记录器”) [xUnit.net 00:02:31.22] 堆栈跟踪: [xUnit.net 00:02:31.22] 在 Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger 记录器,LogLevel logLevel,EventId eventId,异常异常,字符串消息,Object[] args) [xUnit.net 00:02:31.22] 在 Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger 记录器,LogLevel logLevel,异常异常,字符串消息,对象 [] args) [xUnit.net 00:02:31.22] 在 Microsoft.Extensions.Logging.LoggerExtensions.LogError(ILogger 记录器,异常异常,字符串消息,对象 [] 参数) [xUnit.net 00:02:31.22] 在 NX.Data.Client.AddRequest(订阅订阅,ConsumerInfo ci,IMessageConsumer msgConsumer) [xUnit.net 00:02:31.22] 在 NX.Data.Client.Register(订阅订阅,字符串 authToken,IMessageConsumer msgConsumer) [xUnit.net 00:02:31.22]

问题是客户端构造函数如下,但我为logger传递了一个空值。

public Client(string lcClientAddress, ILogger<Client> logger, IFieldDictionary fieldDictionary, SubscriptionIdGenerator subscriptionIdGenerator, ILifetimeScope scope);

我按如下方式编辑了我的步骤类构造函数:

private readonly ILogger<Client> _loggerClient;

public EBSIntegrationTestStepDefinitions(ITestOutputHelper testOutputHelper, ScenarioContext scenarioContext, FeatureContext featureContext, ILogger<Client> loggerClient)
{
    _loggerClient = loggerClient;
}

现在当我运行我的测试时,我得到了这个:

xUnit.net 00:00:01.08] BoDi.ObjectContainerException:接口无法解析:Microsoft.Extensions.Logging.ILogger1[[NX.Data.Client, DpNet.Data, Version=0.0.2.178, Culture=neutral, PublicKeyToken=null]] (resolution path: ebs_test_tool.Steps.EBSIntegrationTestStepDefinitions) [xUnit.net 00:00:01.08] Stack Trace: [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.TypeRegistration.&lt;&gt;c__DisplayClass3_0.&lt;ResolvePerContext&gt;b__1() [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.RegistrationWithStrategy.ExecuteWithLock(Object lockObject, Func1 getter,Func1 factory, ResolutionList resolutionPath) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.TypeRegistration.ResolvePerContext(ObjectContainer container, RegistrationKey keyToResolve, ResolutionList resolutionPath) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.RegistrationWithStrategy.Resolve(ObjectContainer container, RegistrationKey keyToResolve, ResolutionList resolutionPath) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.ResolveObject(RegistrationKey keyToResolve, ResolutionList resolutionPath) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.Resolve(Type typeToResolve, ResolutionList resolutionPath, String name) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.&lt;&gt;c__DisplayClass71_0.&lt;ResolveArguments&gt;b__0(ParameterInfo p) [xUnit.net 00:00:01.08] at System.Linq.Enumerable.SelectArrayIterator2.ToArray() [xUnit.net 00:00:01.08] 在 System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.ResolveArguments(IEnumerable1 参数,RegistrationKey keyToResolve,ResolutionList resolutionPath) [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.CreateObject(类型类型,ResolutionList resolutionPath,RegistrationKey keyToResolve) [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.TypeRegistration.c__DisplayClass3_0.b__1() [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.RegistrationWithStrategy.ExecuteWithLock(对象 lockObject,Func1 getter, Func1 工厂,ResolutionList resolutionPath) [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.TypeRegistration.ResolvePerContext(ObjectContainer 容器,RegistrationKey keyToResolve,ResolutionList resolutionPath) [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.RegistrationWithStrategy.Resolve(ObjectContainer 容器,RegistrationKey keyToResolve,ResolutionList resolutionPath) [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.ResolveObject(RegistrationKey keyToResolve, ResolutionList resolutionPath) [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.Resolve(类型 typeToResolve,ResolutionList resolutionPath,字符串名称) [xUnit.net 00:00:01.08] 在 BoDi.ObjectContainer.Resolve(类型 typeToResolve,字符串名称) [xUnit.net 00:00:01.08] 在 TechTalk.SpecFlow.Infrastructure.TestObjectResolver.ResolveBindingInstance(类型 bindingType,IObjectContainer 容器) [xUnit.net 00:00:01.08] 在 lambda_method(闭包,IContextManager,字符串,字符串) [xUnit.net 00:00:01.08] 在 TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding 绑定,IContextManager contextManager,Object[] 参数,ITestTracer testTracer,TimeSpan& 持续时间) [xUnit.net 00:00:01.08] 在 TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch 匹配,对象 [] 参数,时间跨度和持续时间) [xUnit.net 00:00:01.08] 在 TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance) [xUnit.net 00:00:01.08] 在 TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() [xUnit.net 00:00:01.08] 在 TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() [xUnit.net 00:00:01.08] 在 ebs_test_tool.Features.EBSIntegrationTestFeature.ScenarioCleanup() [xUnit.net 00:00:01.08]

我在输出中也注意到了这一点:

[xUnit.net 00:00:01.09] 输出: [xUnit.net 00:00:01.09] 给定 MRF 应用程序“Eb.MarketFeed.Fx”运行版本“0.1.52” [xUnit.net 00:00:01.09] -> 错误:无法解析接口:Microsoft.Extensions.Logging.ILogger`1[NX.Data.Client, DpNet.Data, Version=0.0.2.178, Culture=neutral, PublicKeyToken =null]] (解析路径:eb_test_tool.Steps.IntegrationTestStepDefinitions) (0.0s)

以前,当我遇到类似错误时,我必须将 [Binding] 添加到我的班级,但我已经有了它。

我想知道这是否确实是一个绑定问题,或者只是我试图通过ILogger&lt;Client&gt; 是一个不是Client 的类。我该如何解决这个问题?

【问题讨论】:

    标签: c# .net automated-tests bdd specflow


    【解决方案1】:

    您需要在 SpecFlow IoC 容器中注册一个 ILogger&lt;Client&gt; 对象。这应该在“BeforeScenario”挂钩中完成:

    [Binding]
    public class SpecFlowHooks
    {
        public SpecFlowHooks(IObjectContainer container)
        {
            this.container = container;
        }
    
        [BeforeScenario]
        public void CreateLogger()
        {
            ILogger<Client> logger = // initialize client logger here
    
            container.RegisterInstanceAs(logger);
        }
    }
    

    如果您不这样做,初始化您的步骤定义的新实例的 IoC 容器将不知道如何解析 ILogger&lt;Client&gt; 接口,从而导致您报告的异常。

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多