diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs index 9427c1de85..abb10173d6 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs @@ -29,6 +29,8 @@ public abstract class AbpIntegratedTest : AbpTestBaseWithService application.Initialize(TestServiceScope.ServiceProvider); ServiceProvider = Application.ServiceProvider; + + AfterInitialize(); } protected virtual IServiceCollection CreateServiceCollection() @@ -56,6 +58,11 @@ public abstract class AbpIntegratedTest : AbpTestBaseWithService return services.BuildServiceProviderFromFactory(); } + protected virtual void AfterInitialize() + { + + } + public virtual void Dispose() { Application.Shutdown(); diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Serializer/MongoDB_DateTimeKind_Tests.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Serializer/MongoDB_DateTimeKind_Tests.cs index 6c1718f9a1..272b306416 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Serializer/MongoDB_DateTimeKind_Tests.cs +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Serializer/MongoDB_DateTimeKind_Tests.cs @@ -1,9 +1,6 @@ using System; -using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using MongoDB.Bson.Serialization; -using MongoDB.Bson.Serialization.Serializers; using Shouldly; using Volo.Abp.TestApp.Domain; using Volo.Abp.TestApp.Testing; @@ -12,41 +9,16 @@ using Xunit; namespace Volo.Abp.MongoDB.Serializer; -[Collection(MongoTestCollection.Name)] + public abstract class MongoDB_DateTimeKind_Tests : DateTimeKind_Tests { - protected override void AfterAddApplication(IServiceCollection services) + protected override void AfterInitialize() { - // MongoDB uses static properties to store the mapping information, - // We must reconfigure it in the new unit test. - foreach (var registeredClassMap in BsonClassMap.GetRegisteredClassMaps()) - { - foreach (var declaredMemberMap in registeredClassMap.DeclaredMemberMaps) - { - var serializer = declaredMemberMap.GetSerializer(); - switch (serializer) - { - case AbpMongoDbDateTimeSerializer dateTimeSerializer: - dateTimeSerializer.SetDateTimeKind(Kind); - break; - case NullableSerializer nullableSerializer: - { - var lazySerializer = nullableSerializer.GetType() - ?.GetField("_lazySerializer", BindingFlags.NonPublic | BindingFlags.Instance) - ?.GetValue(serializer)?.As>>(); - - if (lazySerializer?.Value is AbpMongoDbDateTimeSerializer dateTimeSerializer) - { - dateTimeSerializer.SetDateTimeKind(Kind); - } - break; - } - } - } - } + UnitTestSerializerHelper.FixSerializers(Kind); } } +[Collection(MongoTestCollection.Name)] public class DateTimeKindTests_Unspecified : MongoDB_DateTimeKind_Tests { protected override void AfterAddApplication(IServiceCollection services) @@ -89,6 +61,11 @@ public class DisableDateTimeKindTests : TestAppTestBase PersonRepository = GetRequiredService(); } + protected override void AfterInitialize() + { + UnitTestSerializerHelper.FixSerializers(null); + } + protected override void AfterAddApplication(IServiceCollection services) { services.Configure(x => x.UseAbpClockHandleDateTime = false); diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Serializer/UnitTestSerializerHelper.cs b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Serializer/UnitTestSerializerHelper.cs new file mode 100644 index 0000000000..3fa04cbe23 --- /dev/null +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Serializer/UnitTestSerializerHelper.cs @@ -0,0 +1,35 @@ +using System; +using System.Linq; +using System.Reflection; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Serializers; +using Volo.Abp.Timing; + +namespace Volo.Abp.MongoDB.Serializer; + +// MongoDB uses static properties to store the mapping information, +// We must reconfigure it in the new unit test. +public static class UnitTestSerializerHelper +{ + public static void FixSerializers(DateTimeKind? kind) + { + foreach (var registeredClassMap in BsonClassMap.GetRegisteredClassMaps()) + { + foreach (var declaredMemberMap in registeredClassMap.DeclaredMemberMaps.Where(x => x.MemberType == typeof(DateTime) || x.MemberType == typeof(DateTime?))) + { + IBsonSerializer serializer = null; + if (kind != null) + { + serializer = !declaredMemberMap.MemberInfo.IsDefined(typeof(DisableDateTimeNormalizationAttribute), true) + ? declaredMemberMap.MemberType == typeof(DateTime?) ? new NullableSerializer().WithSerializer(new AbpMongoDbDateTimeSerializer(kind.Value, false)) + : new AbpMongoDbDateTimeSerializer(kind.Value, false) + : declaredMemberMap.MemberType == typeof(DateTime?) ? new NullableSerializer().WithSerializer(new DateTimeSerializer(DateTimeKind.Unspecified)) + : new DateTimeSerializer(DateTimeKind.Unspecified); + } + + var fieldInfo = declaredMemberMap.GetType().GetField("_serializer", BindingFlags.NonPublic | BindingFlags.Instance); + fieldInfo?.SetValue(declaredMemberMap, serializer); + } + } + } +}