Reputation: 4253
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
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
Reputation: 4253
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