From 4f72a05233541e1d410e319c27091e7ccbfe3293 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Sun, 26 May 2019 00:24:24 +0300 Subject: [PATCH] Refactor and comment for tests. --- .../MyProjectNameApplicationTestBase.cs | 3 + ...panyName.MyProjectName.Domain.Tests.csproj | 4 +- .../MyProjectNameDomainTestBase.cs | 3 + .../MyProjectNameDomainTestModule.cs | 4 + ...yProjectNameEntityFrameworkCoreTestBase.cs | 3 + .../Samples/SampleRepository_Tests.cs | 5 +- ...ojectName.EntityFrameworkCore.Tests.csproj | 10 +-- .../MongoDB/MyProjectNameMongoDbTestBase.cs | 3 + .../MongoDB/MyProjectNameMongoDbTestModule.cs | 2 +- .../MongoDB/Samples/SampleRepository_Tests.cs | 5 +- ...anyName.MyProjectName.MongoDB.Tests.csproj | 8 +- ...yCompanyName.MyProjectName.TestBase.csproj | 14 +-- .../MyProjectNameDataSeedContributor.cs | 27 ++++++ .../MyProjectNameTestBase.cs | 87 ++++++++++++++++++- .../MyProjectNameTestBaseModule.cs | 15 ++-- .../MyProjectNameTestData.cs | 8 -- .../MyProjectNameTestDataBuilder.cs | 24 ----- .../Samples/SampleRepository_Tests.cs | 4 + ...> MyProjectNameTestDataSeedContributor.cs} | 0 19 files changed, 170 insertions(+), 59 deletions(-) create mode 100644 templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameDataSeedContributor.cs delete mode 100644 templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestData.cs delete mode 100644 templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataBuilder.cs rename templates/mvc/test/MyCompanyName.MyProjectName.TestBase/{MyProjectNameTestDataBuilder.cs => MyProjectNameTestDataSeedContributor.cs} (100%) diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestBase.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestBase.cs index d06f234758..79eac9b1ef 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestBase.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestBase.cs @@ -1,5 +1,8 @@ namespace MyCompanyName.MyProjectName { + /* Inherit from this class for your application layer tests. + * See SampleAppService_Tests for example. + */ public abstract class MyProjectNameApplicationTestBase : MyProjectNameTestBase { diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj b/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj index f318fa557f..559dea539f 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj @@ -8,11 +8,11 @@ - + - + diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestBase.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestBase.cs index 8065776e8d..bfda6bdea4 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestBase.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestBase.cs @@ -1,5 +1,8 @@ namespace MyCompanyName.MyProjectName { + /* Inherit from this class for your domain layer tests. + * See SampleManager_Tests for example. + */ public abstract class MyProjectNameDomainTestBase : MyProjectNameTestBase { diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs index 027e63b867..b45887e4dc 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs @@ -3,6 +3,10 @@ using Volo.Abp.Modularity; namespace MyCompanyName.MyProjectName { + /* Domain tests are configured to use the EF Core provider. + * You can switch to MongoDB, however your domain tests should be + * database independent anyway. + */ [DependsOn( typeof(MyProjectNameEntityFrameworkCoreTestModule) )] diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestBase.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestBase.cs index 66920011c2..13ea29a22f 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestBase.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestBase.cs @@ -1,5 +1,8 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore { + /* This class can be used as a base class for EF Core integration tests, + * while SampleRepository_Tests uses a different approach. + */ public abstract class MyProjectNameEntityFrameworkCoreTestBase : MyProjectNameTestBase { diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepository_Tests.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepository_Tests.cs index 007c46a6ed..5b2f920052 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepository_Tests.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepository_Tests.cs @@ -4,6 +4,9 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore.Samples { public class SampleRepository_Tests : SampleRepository_Tests { - + /* Don't write custom repository tests here, instead write to + * the base class. + * One exception can be some specific tests related to EF core. + */ } } diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 093567c430..d2bf653040 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -7,11 +7,6 @@ MyCompanyName.MyProjectName - - - - - @@ -19,4 +14,9 @@ + + + + + diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestBase.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestBase.cs index fde63712f6..9752ba8f77 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestBase.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestBase.cs @@ -1,5 +1,8 @@ namespace MyCompanyName.MyProjectName.MongoDB { + /* This class can be used as a base class for MongoDB integration tests, + * while SampleRepository_Tests uses a different approach. + */ public abstract class MyProjectNameMongoDbTestBase : MyProjectNameTestBase { diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestModule.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestModule.cs index 00bdedc999..9da609fd4e 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestModule.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/MyProjectNameMongoDbTestModule.cs @@ -19,7 +19,7 @@ namespace MyCompanyName.MyProjectName.MongoDB Configure(options => { - options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString; + options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString + "|MyProjectName"; }); } diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/Samples/SampleRepository_Tests.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/Samples/SampleRepository_Tests.cs index e4aeb3f36f..6522b9884e 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/Samples/SampleRepository_Tests.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MongoDB/Samples/SampleRepository_Tests.cs @@ -4,6 +4,9 @@ namespace MyCompanyName.MyProjectName.MongoDB.Samples { public class SampleRepository_Tests : SampleRepository_Tests { - + /* Don't write custom repository tests here, instead write to + * the base class. + * One exception can be some specific tests related to MongoDB. + */ } } diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj index 6e94bf289a..25651a06c4 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj @@ -8,13 +8,13 @@ - - + + - - + + diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj index 445896bbe4..6aa2eb4b61 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj @@ -7,13 +7,6 @@ MyCompanyName.MyProjectName - - - - - - - @@ -21,6 +14,13 @@ + + + + + + + diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameDataSeedContributor.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameDataSeedContributor.cs new file mode 100644 index 0000000000..871c3274b8 --- /dev/null +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameDataSeedContributor.cs @@ -0,0 +1,27 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; + +namespace MyCompanyName.MyProjectName +{ + public class MyProjectNameDataSeedContributor : IDataSeedContributor, ITransientDependency + { + private readonly IGuidGenerator _guidGenerator; + + public MyProjectNameDataSeedContributor( + IGuidGenerator guidGenerator) + { + _guidGenerator = guidGenerator; + } + + public Task SeedAsync(DataSeedContext context) + { + /* Instead of returning the Task.CompletedTask, you can insert your test data + * at this point! + */ + + return Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBase.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBase.cs index a7b4c4c57a..93304dfaeb 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBase.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBase.cs @@ -1,8 +1,13 @@ -using Volo.Abp; +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; using Volo.Abp.Modularity; +using Volo.Abp.Uow; namespace MyCompanyName.MyProjectName { + /* All test classes are derived from this class, directly or indirectly. */ public abstract class MyProjectNameTestBase : AbpIntegratedTest where TStartupModule : IAbpModule { @@ -10,5 +15,85 @@ namespace MyCompanyName.MyProjectName { options.UseAutofac(); } + + protected virtual void WithUnitOfWork(Action action) + { + WithUnitOfWork(new UnitOfWorkOptions(), action); + } + + protected virtual void WithUnitOfWork(UnitOfWorkOptions options, Action action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + action(); + + uow.Complete(); + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func func) + { + return WithUnitOfWorkAsync(new UnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(UnitOfWorkOptions options, Func action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + await action(); + + await uow.CompleteAsync(); + } + } + } + + protected virtual TResult WithUnitOfWork(Func func) + { + return WithUnitOfWork(new UnitOfWorkOptions(), func); + } + + protected virtual TResult WithUnitOfWork(UnitOfWorkOptions options, Func func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = func(); + uow.Complete(); + return result; + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func> func) + { + return WithUnitOfWorkAsync(new UnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(UnitOfWorkOptions options, Func> func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = await func(); + await uow.CompleteAsync(); + return result; + } + } + } } } diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs index 3e03927dee..dc9082caa6 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestBaseModule.cs @@ -2,7 +2,9 @@ using Volo.Abp; using Volo.Abp.Authorization; using Volo.Abp.Autofac; +using Volo.Abp.Data; using Volo.Abp.Modularity; +using Volo.Abp.Threading; namespace MyCompanyName.MyProjectName { @@ -26,12 +28,15 @@ namespace MyCompanyName.MyProjectName private static void SeedTestData(ApplicationInitializationContext context) { - using (var scope = context.ServiceProvider.CreateScope()) + AsyncHelper.RunSync(async () => { - scope.ServiceProvider - .GetRequiredService() - .Build(); - } + using (var scope = context.ServiceProvider.CreateScope()) + { + await scope.ServiceProvider + .GetRequiredService() + .SeedAsync(); + } + }); } } } diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestData.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestData.cs deleted file mode 100644 index 703ff643e4..0000000000 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestData.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Volo.Abp.DependencyInjection; - -namespace MyCompanyName.MyProjectName -{ - public class MyProjectNameTestData : ISingletonDependency - { - } -} diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataBuilder.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataBuilder.cs deleted file mode 100644 index 0449115b14..0000000000 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataBuilder.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Volo.Abp.DependencyInjection; -using Volo.Abp.Guids; - -namespace MyCompanyName.MyProjectName -{ - public class MyProjectNameTestDataBuilder : ITransientDependency - { - private readonly IGuidGenerator _guidGenerator; - private MyProjectNameTestData _testData; - - public MyProjectNameTestDataBuilder( - IGuidGenerator guidGenerator, - MyProjectNameTestData testData) - { - _guidGenerator = guidGenerator; - _testData = testData; - } - - public void Build() - { - - } - } -} \ No newline at end of file diff --git a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs index 5c61f24fff..09409e4561 100644 --- a/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs +++ b/templates/mvc-module/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs @@ -4,6 +4,10 @@ using Xunit; namespace MyCompanyName.MyProjectName.Samples { + /* Write your custom repository tests like that, in this project, as abstract classes. + * Then inherit these abstract classes from EF Core & MongoDB test projects. + * In this way, both database providers are tests with the same set tests. + */ public abstract class SampleRepository_Tests : MyProjectNameTestBase where TStartupModule : IAbpModule { diff --git a/templates/mvc/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataBuilder.cs b/templates/mvc/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataSeedContributor.cs similarity index 100% rename from templates/mvc/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataBuilder.cs rename to templates/mvc/test/MyCompanyName.MyProjectName.TestBase/MyProjectNameTestDataSeedContributor.cs