How to use XUnit Dependency Constructor Injection to create my concrete classes

I nuget the xunit.DependencyInjection package and created my construction with my interfaces. The test case compiles but when I run xunits it does not execute my constructor dependency injection.

 public class TestSuite{
  IARepository _aRepository;
  IBRepository _bRepository;
    public TestSuite(IARepository aRepository, IBRepository bRepository)
    {
        _aRepository = aRepository;
        _bRepository = bRepository;
    }
}

The GitHub suggests that constructor injection is possible: https://github.com/pengweiqhca/Xunit.DependencyInjection/tree/master/Xunit.DependencyInjection.Test

Startup.cs

 public class Startup
 {
    public void ConfigureServices(IServiceCollection services)
    {

    var configuration = new ConfigurationBuilder()
            .SetBasePath(System.IO.Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .Build();

                    
        var connectionString =     configuration.GetConnectionString("A_DbCoreConnectionString");
        services.AddDbContext<AContext>(options1 => options1.UseSqlServer(connectionString));

        connectionString= configuration.GetConnectionString("B_DbCoreConnectionString");
        services.AddDbContext<BContext>(options2 => options2.UseSqlServer(connectionString));

        services.AddTransient<IARepository, ARepository>();
        services.AddTransient<IBRepository, BRepository>();
    }
  }

A and B Repository.cs

public class ARepository :IARepository
{
    public AContext _dbContext; 
    public ARepository(AContext dbContext) 
    {
        _dbContext = dbContext;
    }
    ...
}

public class BRepository :IBRepository
{
    public BContext _dbContext; 
    public BRepository(BContext dbContext) 
    {
        _dbContext = dbContext;
    }
    ...
}

Upvotes: 9

Views: 6439

Answers (2)

Murilo Maciel Curti
Murilo Maciel Curti

Reputation: 3131

In .Net 6 and later Startup.cs dont work automatically.

The minimun setup required is to create a ServiceCollection and build it to a ServiceProvider:

public class EfRepositoryTests
{
    private ServiceProvider services;

    public EfRepositoryTests()
    {
        var serviceCollection = new ServiceCollection();

        serviceCollection.AddDbContext<BloggingContext>(ServiceLifetime.Singleton);
        serviceCollection.AddSingleton<EfRepository<Blog>>();

        this.services = serviceCollection.BuildServiceProvider();
    }

    [Fact]
    public async Task CreateAsync()
    {

        var ctx = this.services.GetRequiredService<BloggingContext>();
        var repository = this.services.GetRequiredService<EfRepository<Blog>>();

        //...
    }
}

Upvotes: 4

I was able to get the dependency injection to work in xunit once I added the startup.cs code

Solution startup.cs file in your XUnit Project:

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{

var configuration = new ConfigurationBuilder()
        .SetBasePath(System.IO.Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", false, true)
        .Build();

                
    var connectionString =     configuration.GetConnectionString("A_DbCoreConnectionString");
    services.AddDbContext<AContext>(options1 => options1.UseSqlServer(connectionString));

    connectionString= configuration.GetConnectionString("B_DbCoreConnectionString");
    services.AddDbContext<BContext>(options2 => options2.UseSqlServer(connectionString));

    services.AddTransient<IARepository, ARepository>();
    services.AddTransient<IBRepository, BRepository>();
  }
 }

Upvotes: 3

Related Questions