From 2d31fc85956894013c1ca27b11ea3f3e7f65d224 Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 28 Jan 2024 09:57:36 +0800 Subject: [PATCH] Add unit tests. --- .../Volo/Abp/DynamicProxy/ProxyHelper.cs | 8 +++++++ .../Mvc/AbpAspNetCoreMvcTestModule.cs | 3 +++ .../Mvc/ConventionalController_Tests.cs | 21 +++++++++++++++++++ .../Application/ConventionalAppService.cs | 17 +++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ConventionalController_Tests.cs create mode 100644 framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/ConventionalAppService.cs diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs index 5b4f6c6349..203794a6d9 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs @@ -8,6 +8,14 @@ public static class ProxyHelper { private const string ProxyNamespace = "Castle.Proxies"; + /// + /// Checks if given object is a dynamic proxy. + /// + public static bool IsProxy(object obj) + { + return obj.GetType().Namespace == ProxyNamespace; + } + /// /// Returns dynamic proxy target object if this is a proxied object, otherwise returns the given object. /// It supports Castle Dynamic Proxies. diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index d5a940e5de..3f9c605f64 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -19,6 +19,7 @@ using Volo.Abp.Localization; using Volo.Abp.MemoryDb; using Volo.Abp.Modularity; using Volo.Abp.TestApp; +using Volo.Abp.TestApp.Application; using Volo.Abp.Threading; using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; @@ -53,6 +54,8 @@ public class AbpAspNetCoreMvcTestModule : AbpModule string.Equals(urlActionNameNormalizerContext.ActionNameInUrl, "phone", StringComparison.OrdinalIgnoreCase) ? "phones" : urlActionNameNormalizerContext.ActionNameInUrl; + + opts.TypePredicate = type => type != typeof(ConventionalAppService); }); options.ExposeIntegrationServices = true; diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ConventionalController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ConventionalController_Tests.cs new file mode 100644 index 0000000000..41602ff1e8 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ConventionalController_Tests.cs @@ -0,0 +1,21 @@ +using Shouldly; +using Volo.Abp.DynamicProxy; +using Volo.Abp.TestApp.Application; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc; + +public class ConventionalController_Tests : AspNetCoreMvcTestBase +{ + [Fact] + public void Conventional_Controller_Should_Disable_DynamicProxy() + { + // PeopleAppService is a conventional controller + var peopleAppService = GetRequiredService(); + ProxyHelper.IsProxy(peopleAppService).ShouldBeFalse(); + + // ConventionalAppService is not a conventional controller + var conventionalAppService = GetRequiredService(); + ProxyHelper.IsProxy(conventionalAppService).ShouldBeTrue(); + } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/ConventionalAppService.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/ConventionalAppService.cs new file mode 100644 index 0000000000..4d38d8989b --- /dev/null +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/ConventionalAppService.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Services; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Uow; + +namespace Volo.Abp.TestApp.Application; + +public class ConventionalAppService : IApplicationService, ITransientDependency +{ + [Authorize] + [UnitOfWork] + public virtual Task GetAsync() + { + return Task.CompletedTask; + } +}