question

paulcarron-8869 avatar image
0 Votes"
paulcarron-8869 asked paulcarron-8869 published

BoDi.ObjectContainerException : Interface cannot be resolved in Specflow test

I have this step in a Specflow test:

 [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);
     }
 }

When I ran it I got this error:

[xUnit.net 00:02:31.22] System.ArgumentNullException : Value cannot be null. (Parameter 'logger') [xUnit.net 00:02:31.22] Stack Trace: [xUnit.net 00:02:31.22] at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger, LogLevel logLevel, EventId eventId, Exception exception, String message, Object[] args) [xUnit.net 00:02:31.22] at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger, LogLevel logLevel, Exception exception, String message, Object[] args) [xUnit.net 00:02:31.22] at Microsoft.Extensions.Logging.LoggerExtensions.LogError(ILogger logger, Exception exception, String message, Object[] args) [xUnit.net 00:02:31.22] at NX.Data.Client.AddRequest(Subscription sub, ConsumerInfo ci, IMessageConsumer msgConsumer) [xUnit.net 00:02:31.22] at NX.Data.Client.Register(Subscription sub, String authToken, IMessageConsumer msgConsumer) [xUnit.net 00:02:31.22]

The problem is that the Client constructor is as follows but I was passing a null for logger.

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

I edited my steps class constructor as follows:

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

Now when I run my test I get this:

xUnit.net 00:00:01.08] BoDi.ObjectContainerException : Interface cannot be resolved: 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.<>c_DisplayClass3_0.<ResolvePerContext>b1() [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.<>cDisplayClass71_0.<ResolveArguments>b0(ParameterInfo p) [xUnit.net 00:00:01.08] at System.Linq.Enumerable.SelectArrayIterator2.ToArray() [xUnit.net 00:00:01.08] at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.ResolveArguments(IEnumerable1 parameters, RegistrationKey keyToResolve, ResolutionList resolutionPath) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.CreateObject(Type type, ResolutionList resolutionPath, RegistrationKey keyToResolve) [xUnit.net 00:00:01.08] at BoDi.ObjectContainer.TypeRegistration.<>cDisplayClass3_0.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.Resolve(Type typeToResolve, String name) [xUnit.net 00:00:01.08] at TechTalk.SpecFlow.Infrastructure.TestObjectResolver.ResolveBindingInstance(Type bindingType, IObjectContainer container) [xUnit.net 00:00:01.08] at lambda_method(Closure , IContextManager , String , String ) [xUnit.net 00:00:01.08] at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) [xUnit.net 00:00:01.08] at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments, TimeSpan& duration) [xUnit.net 00:00:01.08] at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance) [xUnit.net 00:00:01.08] at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() [xUnit.net 00:00:01.08] at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() [xUnit.net 00:00:01.08] at ebs_test_tool.Features.EBSIntegrationTestFeature.ScenarioCleanup() [xUnit.net 00:00:01.08]

I also noticed this in my output:

[xUnit.net 00:00:01.09] Output: [xUnit.net 00:00:01.09] Given MRF application "Eb.MarketFeed.Fx" runs version "0.1.52" [xUnit.net 00:00:01.09] -> error: Interface cannot be resolved: Microsoft.Extensions.Logging.ILogger`1[NX.Data.Client, DpNet.Data, Version=0.0.2.178, Culture=neutral, PublicKeyToken=null]] (resolution path: eb_test_tool.Steps.IntegrationTestStepDefinitions) (0.0s)

Previously when I got a similar error I had to add [Binding] to my class but I already have it.

I'm wondering if this is indeed a binding issue or if it's just that I'm trying to pass ILogger<Client> is a class that isn't Client. How do I resolve this?



dotnet-csharp
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

0 Answers