How to Inject 'Microsoft.Extensions.Configuration.IConfiguration' using AddTransient Method in XUnit

Viewed 5175

I am trying to Unit test a method which in in class TWService and require two dependencies to Inject i.e IXMLResponseSave and IConfiguration. I am able to inject dependency for IXMLResponseSave using below line in my Fact.

services.AddTransient<IXMLResponseSave, XMLFileResponseSaveBlob>();  

How should I inject dependency for IConfiguration.

Below is my sample Controller code which i want to test.

[Route("api/[controller]")]
[AllowAnonymous]
[ApiController]
public class TWBookingController : ControllerBase
{

    private readonly ITWService _twservice;

    public TWBookingController(ITWService tWService)
    {
        _twservice = tWService;
    }      

    public IActionResult SomeTestAction([FromBody]SomeParameter someParameter)
    {

        if(someParameter !=null && ValidatePassenger(someParameter) && (someParameter.pnrRequired>0 || someParameter.quotesrRequired > 0))
        {
            var result = _twservice.SomeTestMethod(someParameter);
            return Ok(result);
        }
        else
            return BadRequest();
    }      
}

public class TWService : ITWService
{
    private IConfiguration _config;   
    private IXMLResponseSave _xMLResponseSave;
    private string format = "Mddyyyyhhmmss";

    public TWService(IConfiguration config, IXMLResponseSave xMLResponseSave)
    {
        _config = config;
        _xMLResponseSave = xMLResponseSave;
    }

    public TWAutoSearchRes SomeTestMethod(SomeParameter someParameter)
    {
        //Some Implementation

    }
}

Code written for Unit Test.

[Fact]
public void Test_Valid()
{
    someParameter_Valid = BuildValidRequest();
    var services = new ServiceCollection();
    services.AddTransient<ITWService, TWService>();           
    services.AddTransient<IXMLResponseSave, XMLFileResponseSaveBlob>();            
    var serviceProvider = services.BuildServiceProvider();
    _tWService = serviceProvider.GetService<ITWService>();
    var response = _tWService.SomeTestMethod(someParameter_Valid);
    Assert.IsType<OkResult>(response);
}

Currently I am getting below error message:

Unable to resolve service for type 'Microsoft.Extensions.Configuration.IConfiguration' while attempting to activate ''

1 Answers

Here is the code snippet that will help you to resolve IConfiguration dependency

services.AddTransient<IConfiguration>(sp =>
        {
            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddJsonFile("appsettings.json");
            return configurationBuilder.Build();
        });

You have to include following NuGet packages to run the above code inside the *Test project:

  1. Microsoft.Extensions.Configuration
  2. Microsoft.Extensions.Configuration.Json

p.s. You don't need to inject real objects to write unit test cases rather you could use Mock Objects. In addition, Instead of passing IConfiguration interface, you can pass a POCO class or IOptions interface.

Related