Browse Source

Use `Testcontainers` in unit test project.

Testcontainers
maliming 2 years ago
parent
commit
4246eb293a
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 20
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreFixture.cs
  2. 49
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs
  3. 2
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj
  4. 29
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDb/MyProjectNameMongoDbFixture.cs
  5. 5
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj

20
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreFixture.cs

@ -1,11 +1,27 @@
using System;
using System.Threading.Tasks;
using Testcontainers.MsSql;
using Xunit;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public class MyProjectNameEntityFrameworkCoreFixture : IDisposable
public class MyProjectNameEntityFrameworkCoreFixture : IAsyncLifetime
{
public void Dispose()
private readonly static MsSqlContainer _msSqlContainer = new MsSqlBuilder().Build();
public async Task InitializeAsync()
{
await _msSqlContainer.StartAsync();
}
public static string GetRandomConnectionString()
{
var randomDbName = "Database=Db_" + Guid.NewGuid().ToString("N");
return _msSqlContainer.GetConnectionString().Replace("Database=master", randomDbName, StringComparison.OrdinalIgnoreCase);
}
public async Task DisposeAsync()
{
await _msSqlContainer.DisposeAsync().AsTask();
}
}

49
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs

@ -1,11 +1,6 @@
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Sqlite;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement;
@ -16,13 +11,10 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
[DependsOn(
typeof(MyProjectNameApplicationTestModule),
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqliteModule)
typeof(MyProjectNameEntityFrameworkCoreModule)
)]
public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule
{
private SqliteConnection? _sqliteConnection;
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<FeatureManagementOptions>(options =>
@ -42,41 +34,24 @@ public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule
});
context.Services.AddAlwaysDisableUnitOfWorkTransaction();
ConfigureInMemorySqlite(context.Services);
ConfigureMsSqlDatabase(context.Services);
}
private void ConfigureInMemorySqlite(IServiceCollection services)
private void ConfigureMsSqlDatabase(IServiceCollection services)
{
_sqliteConnection = CreateDatabaseAndGetConnection();
var connectionString = MyProjectNameEntityFrameworkCoreFixture.GetRandomConnectionString();
using (var context = new MyProjectNameDbContext(new DbContextOptionsBuilder<MyProjectNameDbContext>()
.UseSqlServer(connectionString)
.Options))
{
context.Database.Migrate();
}
services.Configure<AbpDbContextOptions>(options =>
{
options.Configure(context =>
{
context.DbContextOptions.UseSqlite(_sqliteConnection);
context.DbContextOptions.UseSqlServer(connectionString);
});
});
}
public override void OnApplicationShutdown(ApplicationShutdownContext context)
{
_sqliteConnection?.Dispose();
}
private static SqliteConnection CreateDatabaseAndGetConnection()
{
var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<MyProjectNameDbContext>()
.UseSqlite(connection)
.Options;
using (var context = new MyProjectNameDbContext(options))
{
context.GetService<IRelationalDatabaseCreator>().CreateTables();
}
return connection;
}
}

2
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj

@ -11,11 +11,11 @@
<ItemGroup>
<ProjectReference Include="..\..\src\MyCompanyName.MyProjectName.EntityFrameworkCore\MyCompanyName.MyProjectName.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\MyCompanyName.MyProjectName.Application.Tests\MyCompanyName.MyProjectName.Application.Tests.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.EntityFrameworkCore.Sqlite\Volo.Abp.EntityFrameworkCore.Sqlite.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="Testcontainers.MsSql" Version="3.7.0" />
</ItemGroup>
</Project>

29
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDb/MyProjectNameMongoDbFixture.cs

@ -1,34 +1,27 @@
using System;
using EphemeralMongo;
using System.Threading.Tasks;
using Testcontainers.MongoDb;
using Xunit;
namespace MyCompanyName.MyProjectName.MongoDB;
public class MyProjectNameMongoDbFixture : IDisposable
public class MyProjectNameMongoDbFixture : IAsyncLifetime
{
public readonly static IMongoRunner MongoDbRunner;
private readonly static MongoDbContainer _mongoDbContainer = new MongoDbBuilder().WithCommand().Build();
static MyProjectNameMongoDbFixture()
public async Task InitializeAsync()
{
MongoDbRunner = MongoRunner.Run(new MongoRunnerOptions
{
UseSingleNodeReplicaSet = true
});
await _mongoDbContainer.StartAsync();
}
public static string GetRandomConnectionString()
{
return GetConnectionString("Db_" + Guid.NewGuid().ToString("N"));
var randomDbName = "Db_" + Guid.NewGuid().ToString("N");
return _mongoDbContainer.GetConnectionString().EnsureEndsWith('/') + randomDbName + "?authSource=admin";
}
public static string GetConnectionString(string databaseName)
public async Task DisposeAsync()
{
var stringArray = MongoDbRunner.ConnectionString.Split('?');
var connectionString = stringArray[0].EnsureEndsWith('/') + databaseName + "/?" + stringArray[1];
return connectionString;
}
public void Dispose()
{
MongoDbRunner?.Dispose();
await _mongoDbContainer.DisposeAsync().AsTask();
}
}

5
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj

@ -15,10 +15,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="EphemeralMongo.Core" Version="1.1.3" />
<PackageReference Include="EphemeralMongo6.runtime.linux-x64" Version="1.1.3" Condition="$([MSBuild]::IsOSPlatform('Linux'))" />
<PackageReference Include="EphemeralMongo6.runtime.osx-x64" Version="1.1.3" Condition="$([MSBuild]::IsOSPlatform('OSX'))" />
<PackageReference Include="EphemeralMongo6.runtime.win-x64" Version="1.1.3" Condition="$([MSBuild]::IsOSPlatform('Windows'))" />
<PackageReference Include="Testcontainers.MongoDb" Version="3.7.0" />
</ItemGroup>
</Project>

Loading…
Cancel
Save