Added unit test for transaction fo EF core.

pull/112/head
Halil İbrahim Kalkan 8 years ago
parent 51f450b207
commit 78df9ea118

@ -136,7 +136,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Identity.Applicati
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Identity.Domain", "src\Volo.Abp.Identity.Domain\Volo.Abp.Identity.Domain.csproj", "{43D4005C-4F04-4128-937B-52BEAC5A113B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Identity.Domain.Shared", "src\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj", "{DF676F73-3FC9-46CE-909A-2D75E19982AD}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Identity.Domain.Shared", "src\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj", "{DF676F73-3FC9-46CE-909A-2D75E19982AD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EntityFrameworkCore.Tests", "test\Volo.Abp.EntityFrameworkCore.Tests\Volo.Abp.EntityFrameworkCore.Tests.csproj", "{3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -348,6 +350,10 @@ Global
{DF676F73-3FC9-46CE-909A-2D75E19982AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF676F73-3FC9-46CE-909A-2D75E19982AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF676F73-3FC9-46CE-909A-2D75E19982AD}.Release|Any CPU.Build.0 = Release|Any CPU
{3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -413,6 +419,7 @@ Global
{40E21A35-1C66-4E89-A16E-0475011F7EFD} = {146F561E-C7B8-4166-9383-47E1BC1A2E62}
{43D4005C-4F04-4128-937B-52BEAC5A113B} = {1895A5C9-50D4-4568-9A3A-14657E615A5E}
{DF676F73-3FC9-46CE-909A-2D75E19982AD} = {1895A5C9-50D4-4568-9A3A-14657E615A5E}
{3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8} = {37087D1B-3693-4E96-983D-A69F210BDE53}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

@ -39,6 +39,18 @@ namespace Volo.Abp
Modules = LoadModules(services, options);
}
public virtual void Shutdown()
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.ShutdownModules(new ApplicationShutdownContext());
}
public virtual void Dispose()
{
}
private IReadOnlyList<IAbpModuleDescriptor> LoadModules(IServiceCollection services, AbpApplicationCreationOptions options)
{
return services
@ -50,16 +62,14 @@ namespace Volo.Abp
);
}
public virtual void Shutdown()
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.ShutdownModules(new ApplicationShutdownContext());
}
public virtual void Dispose()
protected virtual void InitializeModules()
{
using (var scope = ServiceProvider.CreateScope())
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(scope.ServiceProvider));
}
}
}
}

@ -1,7 +1,6 @@
using System;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp
{
@ -25,12 +24,7 @@ namespace Volo.Abp
ServiceProvider = serviceProvider;
using (var scope = ServiceProvider.CreateScope())
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(scope.ServiceProvider));
}
InitializeModules();
}
}
}

@ -1,7 +1,6 @@
using System;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp
{
@ -37,12 +36,7 @@ namespace Volo.Abp
ServiceScope = Services.BuildServiceProviderFromFactory().CreateScope();
ServiceProvider = ServiceScope.ServiceProvider;
using (var scope = ServiceProvider.CreateScope())
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(scope.ServiceProvider));
}
InitializeModules();
}
public override void Dispose()

@ -37,6 +37,14 @@ namespace Volo.Abp
services.AddAssemblyOf<AbpKernelModule>();
services.TryAddObjectAccessor<IServiceProvider>();
services.Configure<ModuleLifecycleOptions>(options =>
{
options.Contributers.Add<OnPreApplicationInitializationModuleLifecycleContributer>();
options.Contributers.Add<OnApplicationInitializationModuleLifecycleContributer>();
options.Contributers.Add<OnPostApplicationInitializationModuleLifecycleContributer>();
options.Contributers.Add<OnApplicationShutdownModuleLifecycleContributer>();
});
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)

@ -4,7 +4,14 @@ using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.Modularity
{
public abstract class AbpModule : IAbpModule, IOnApplicationInitialization, IOnApplicationShutdown, IPreConfigureServices, IPostConfigureServices
public abstract class AbpModule :
IAbpModule,
IOnPreApplicationInitialization,
IOnApplicationInitialization,
IOnPostApplicationInitialization,
IOnApplicationShutdown,
IPreConfigureServices,
IPostConfigureServices
{
public virtual void PreConfigureServices(IServiceCollection services)
{
@ -21,11 +28,21 @@ namespace Volo.Abp.Modularity
}
public virtual void OnPreApplicationInitialization(ApplicationInitializationContext context)
{
}
public virtual void OnApplicationInitialization(ApplicationInitializationContext context)
{
}
public virtual void OnPostApplicationInitialization(ApplicationInitializationContext context)
{
}
public virtual void OnApplicationShutdown(ApplicationShutdownContext context)
{

@ -1,15 +1,34 @@
namespace Volo.Abp.Modularity
{
public class DefaultModuleLifecycleContributer : ModuleLifecycleContributerBase
public class OnApplicationInitializationModuleLifecycleContributer : ModuleLifecycleContributerBase
{
public override void Initialize(ApplicationInitializationContext context, IAbpModule module)
{
(module as IOnApplicationInitialization)?.OnApplicationInitialization(context);
}
}
public class OnApplicationShutdownModuleLifecycleContributer : ModuleLifecycleContributerBase
{
public override void Shutdown(ApplicationShutdownContext context, IAbpModule module)
{
(module as IOnApplicationShutdown)?.OnApplicationShutdown(context);
}
}
public class OnPreApplicationInitializationModuleLifecycleContributer : ModuleLifecycleContributerBase
{
public override void Initialize(ApplicationInitializationContext context, IAbpModule module)
{
(module as IOnPreApplicationInitialization)?.OnPreApplicationInitialization(context);
}
}
public class OnPostApplicationInitializationModuleLifecycleContributer : ModuleLifecycleContributerBase
{
public override void Initialize(ApplicationInitializationContext context, IAbpModule module)
{
(module as IOnPostApplicationInitialization)?.OnPostApplicationInitialization(context);
}
}
}

@ -0,0 +1,9 @@
using JetBrains.Annotations;
namespace Volo.Abp.Modularity
{
public interface IOnPostApplicationInitialization
{
void OnPostApplicationInitialization([NotNull] ApplicationInitializationContext context);
}
}

@ -0,0 +1,9 @@
using JetBrains.Annotations;
namespace Volo.Abp.Modularity
{
public interface IOnPreApplicationInitialization
{
void OnPreApplicationInitialization([NotNull] ApplicationInitializationContext context);
}
}

@ -0,0 +1,14 @@
using Volo.Abp.Collections;
namespace Volo.Abp.Modularity
{
public class ModuleLifecycleOptions
{
public ITypeList<IModuleLifecycleContributer> Contributers { get; }
public ModuleLifecycleOptions()
{
Contributers = new TypeList<IModuleLifecycleContributer>();
}
}
}

@ -1,5 +1,9 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Modularity
@ -12,12 +16,18 @@ namespace Volo.Abp.Modularity
public ModuleManager(
IModuleContainer moduleContainer,
IEnumerable<IModuleLifecycleContributer> lifecycleContributers,
ILogger<ModuleManager> logger)
ILogger<ModuleManager> logger,
IOptions<ModuleLifecycleOptions> options,
IServiceProvider serviceProvider)
{
_moduleContainer = moduleContainer;
_lifecycleContributers = lifecycleContributers;
_logger = logger;
_lifecycleContributers = options.Value
.Contributers
.Select(serviceProvider.GetRequiredService)
.Cast<IModuleLifecycleContributer>()
.ToArray();
}
public void InitializeModules(ApplicationInitializationContext context)

@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<AssemblyName>Volo.Abp.EntityFrameworkCore.Tests</AssemblyName>
<PackageId>Volo.Abp.EntityFrameworkCore.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.EntityFrameworkCore\Volo.Abp.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\Volo.Abp.TestApp\Volo.Abp.TestApp.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="Volo\Abp\TestApp\EntityFrameworkCore\" />
</ItemGroup>
</Project>

@ -0,0 +1,42 @@
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
using Volo.Abp.TestApp;
using Volo.Abp.TestApp.EntityFrameworkCore;
namespace Volo.Abp.EntityFrameworkCore
{
[DependsOn(typeof(AbpEntityFrameworkCoreModule))]
[DependsOn(typeof(TestAppModule))]
[DependsOn(typeof(AbpAutofacModule))]
public class AbpEntityFrameworkCoreTestModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpEntityFrameworkCoreTestModule>();
services.AddAbpDbContext<TestAppDbContext>(options =>
{
options.WithDefaultRepositories();
});
var inMemorySqlite = new SqliteConnection("Data Source=:memory:");
inMemorySqlite.Open();
services.Configure<AbpDbContextOptions>(options =>
{
options.Configure(context =>
{
context.DbContextOptions.UseSqlite(inMemorySqlite);
});
});
}
public override void OnPreApplicationInitialization(ApplicationInitializationContext context)
{
context.ServiceProvider.GetRequiredService<TestAppDbContext>().Database.EnsureCreated();
}
}
}

@ -0,0 +1,12 @@
using Volo.Abp.TestBase;
namespace Volo.Abp.EntityFrameworkCore
{
public abstract class EntityFrameworkCoreTestBase : AbpIntegratedTest<AbpEntityFrameworkCoreTestModule>
{
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
}
}
}

@ -0,0 +1,38 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.TestApp.Domain;
using Xunit;
namespace Volo.Abp.EntityFrameworkCore.Repositories
{
public class Basic_Repository_Tests : EntityFrameworkCoreTestBase
{
private readonly IRepository<Person> _personRepository;
public Basic_Repository_Tests()
{
_personRepository = ServiceProvider.GetRequiredService<IRepository<Person>>();
}
[Fact]
public void GetList()
{
_personRepository.GetList().Any().ShouldBeTrue();
}
[Fact]
public async Task InsertAsync()
{
var personId = Guid.NewGuid();
await _personRepository.InsertAsync(new Person(personId, "Adam", 42));
var person = await _personRepository.FindAsync(personId);
person.ShouldNotBeNull();
}
}
}

@ -0,0 +1,43 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.TestApp.Domain;
using Xunit;
namespace Volo.Abp.EntityFrameworkCore
{
public class Transaction_Tests : EntityFrameworkCoreTestBase
{
private readonly IRepository<Person> _personRepository;
public Transaction_Tests()
{
_personRepository = ServiceProvider.GetRequiredService<IRepository<Person>>();
}
[Fact]
public async Task Should_Rollback_Transaction_When_An_Exception_Is_Thrown()
{
var personId = Guid.NewGuid();
const string exceptionMessage = "thrown to rollback the transaction!";
try
{
await WithUnitOfWorkAsync(async () =>
{
await _personRepository.InsertAsync(new Person(personId, "Adam", 42));
throw new Exception(exceptionMessage);
});
}
catch (Exception e) when(e.Message == exceptionMessage)
{
}
var person = await _personRepository.FindAsync(personId);
person.ShouldBeNull();
}
}
}

@ -0,0 +1,17 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.TestApp.Domain;
namespace Volo.Abp.TestApp.EntityFrameworkCore
{
public class TestAppDbContext : AbpDbContext<TestAppDbContext>
{
public DbSet<Person> People { get; set; }
public TestAppDbContext(DbContextOptions<TestAppDbContext> options)
: base(options)
{
}
}
}
Loading…
Cancel
Save