Skip to content

Commit 98ff490

Browse files
authored
refactor: defer dbcontext registration to strategy (#60)
1 parent e8d0547 commit 98ff490

File tree

8 files changed

+21
-14
lines changed

8 files changed

+21
-14
lines changed

src/ArwynFr.IntegrationTesting/DatabaseTestStrategy.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.EntityFrameworkCore;
22
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.Extensions.DependencyInjection.Extensions;
34

45
namespace ArwynFr.IntegrationTesting;
56

@@ -9,7 +10,10 @@ internal sealed class DatabaseTestStrategy<TContext> : IDatabaseTestStrategy<TCo
910
private bool transaction = false;
1011
private bool transient = false;
1112

12-
public ServiceLifetime Lifetime => transaction ? ServiceLifetime.Singleton : ServiceLifetime.Scoped;
13+
private ServiceLifetime Lifetime
14+
=> transaction
15+
? ServiceLifetime.Singleton
16+
: ServiceLifetime.Scoped;
1317

1418
public async Task DisposeAsync(TContext database)
1519
{
@@ -32,6 +36,14 @@ public async Task InitializeAsync(TContext database)
3236
}
3337
}
3438

39+
public void RegisterDbContext(IServiceCollection services, Action<IServiceProvider, DbContextOptionsBuilder> configureDbContext)
40+
{
41+
services.RemoveAll<TContext>();
42+
services.RemoveAll<DbContextOptions<TContext>>();
43+
services.AddDbContext<TContext>(configureDbContext, Lifetime);
44+
services.Add(new ServiceDescriptor(typeof(TContext), typeof(TContext), Lifetime));
45+
}
46+
3547
public DatabaseTestStrategy<TContext> WithPerTest()
3648
{
3749
transient = true;

src/ArwynFr.IntegrationTesting/IDatabaseTestStrategy.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ public interface IDatabaseTestStrategy<TContext>
2222
/// </summary>
2323
public static IDatabaseTestStrategy<TContext> Transaction => new DatabaseTestStrategy<TContext>().WithTransaction();
2424

25-
ServiceLifetime Lifetime { get; }
2625
Task DisposeAsync(TContext database);
2726
Task InitializeAsync(TContext database);
28-
27+
void RegisterDbContext(IServiceCollection services, Action<IServiceProvider, DbContextOptionsBuilder> configureDbContext);
2928
}

src/ArwynFr.IntegrationTesting/IntegrationTestBase.Database.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Microsoft.EntityFrameworkCore;
22
using Microsoft.Extensions.DependencyInjection;
3-
using Microsoft.Extensions.DependencyInjection.Extensions;
43
using Xunit.Abstractions;
54

65
namespace ArwynFr.IntegrationTesting;
@@ -28,12 +27,9 @@ public override async Task InitializeAsync()
2827
protected override void ConfigureAppServices(IServiceCollection services)
2928
{
3029
base.ConfigureAppServices(services);
31-
services.RemoveAll<TContext>();
32-
services.RemoveAll<DbContextOptions<TContext>>();
33-
services.AddDbContext<TContext>(ConfigureDbContext, DatabaseTestStrategy.Lifetime);
34-
services.Add(new ServiceDescriptor(typeof(TContext), typeof(TContext), DatabaseTestStrategy.Lifetime));
30+
DatabaseTestStrategy.RegisterDbContext(services, ConfigureDbContext);
3531
}
3632

37-
protected abstract void ConfigureDbContext(DbContextOptionsBuilder builder);
33+
protected abstract void ConfigureDbContext(IServiceProvider services, DbContextOptionsBuilder builder);
3834

3935
}

test/ArwynFr.IntegrationTesting.Tests/EntityFrameworkCore/DatabaseDefaultStrategyTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ public override async Task InitializeAsync()
2020
await base.InitializeAsync();
2121
}
2222

23-
protected override void ConfigureDbContext(DbContextOptionsBuilder builder)
23+
protected override void ConfigureDbContext(IServiceProvider services, DbContextOptionsBuilder builder)
2424
=> builder.UseSqlite($@"Data Source={Guid.NewGuid()}.sqlite");
2525
}

test/ArwynFr.IntegrationTesting.Tests/EntityFrameworkCore/DatabaseMigrationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public async Task PerTestStrategy_uses_migrations()
1818
protected override IDatabaseTestStrategy<MigrationDbContext> DatabaseTestStrategy
1919
=> IDatabaseTestStrategy<MigrationDbContext>.DatabasePerTest;
2020

21-
protected override void ConfigureDbContext(DbContextOptionsBuilder builder)
21+
protected override void ConfigureDbContext(IServiceProvider services, DbContextOptionsBuilder builder)
2222
=> builder.UseSqlite($@"Data Source={Guid.NewGuid()}.sqlite");
2323
}

test/ArwynFr.IntegrationTesting.Tests/EntityFrameworkCore/DatabaseNonRelationalTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ public void PerTestStrategy_creates_non_relational_DB()
1717
protected override IDatabaseTestStrategy<DummyDbContext> DatabaseTestStrategy
1818
=> IDatabaseTestStrategy<DummyDbContext>.DatabasePerTest;
1919

20-
protected override void ConfigureDbContext(DbContextOptionsBuilder builder)
20+
protected override void ConfigureDbContext(IServiceProvider services, DbContextOptionsBuilder builder)
2121
=> builder.UseInMemoryDatabase(Guid.NewGuid().ToString());
2222
}

test/ArwynFr.IntegrationTesting.Tests/EntityFrameworkCore/DatabasePerTestStrategyTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ public void PerTestStrategy_creates_database()
1717
protected override IDatabaseTestStrategy<DummyDbContext> DatabaseTestStrategy
1818
=> IDatabaseTestStrategy<DummyDbContext>.DatabasePerTest;
1919

20-
protected override void ConfigureDbContext(DbContextOptionsBuilder builder)
20+
protected override void ConfigureDbContext(IServiceProvider services, DbContextOptionsBuilder builder)
2121
=> builder.UseSqlite($@"Data Source={Guid.NewGuid()}.sqlite");
2222
}

test/ArwynFr.IntegrationTesting.Tests/EntityFrameworkCore/DatabaseTransactionStrategyTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ public override async Task InitializeAsync()
2323
protected override IDatabaseTestStrategy<DummyDbContext> DatabaseTestStrategy
2424
=> IDatabaseTestStrategy<DummyDbContext>.Transaction;
2525

26-
protected override void ConfigureDbContext(DbContextOptionsBuilder builder)
26+
protected override void ConfigureDbContext(IServiceProvider services, DbContextOptionsBuilder builder)
2727
=> builder.UseSqlite($@"Data Source={Guid.NewGuid()}.sqlite");
2828
}

0 commit comments

Comments
 (0)