Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception: SqliteConnection does not support nested transactions when unit testing application services #6050

Closed
RayMMond opened this issue Nov 4, 2020 · 8 comments

Comments

@RayMMond
Copy link
Contributor

RayMMond commented Nov 4, 2020

abp ver: 3.3.0
Suddenly, all my application unit tests are failed because of

System.InvalidOperationException: SqliteConnection does not support nested transactions.

And both domain/ef tests are good, and I'm not changing anything related to uow.
I tested with vs/rider/cmdline, same result.
Full log here:

Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor...

Volo.Abp.AbpInitializationException
An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module YuXiang.Ticket.TicketTestBaseModule, YuXiang.Ticket.TestBase, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: An exception was thrown while activating Volo.Abp.Identity.IdentityDataSeedContributor -> Volo.Abp.Identity.IdentityDataSeeder -> Castle.Proxies.IdentityUserManagerProxy.. See the inner exception for details.
   at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context)
   at Volo.Abp.AbpApplicationBase.InitializeModules()
   at Volo.Abp.AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider)
   at Volo.Abp.Testing.AbpIntegratedTest`1..ctor()
   at YuXiang.Ticket.TicketTestBase`1..ctor()
   at YuXiang.Ticket.TicketApplicationTestBase..ctor() in D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.Application.Tests\TicketApplicationTestBase.cs:line 14
   at YuXiang.Ticket.Accounts.AccountAppServiceTests..ctor() in D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.Application.Tests\Accounts\AccountAppServiceTests.cs:line 21

Autofac.Core.DependencyResolutionException
An exception was thrown while activating Volo.Abp.Identity.IdentityDataSeedContributor -> Volo.Abp.Identity.IdentityDataSeeder -> Castle.Proxies.IdentityUserManagerProxy.
   at Autofac.Core.Resolving.InstanceLookup.CreateInstance(IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Execute()
   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request)
   at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(ResolveRequest request)
   at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request)
   at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request)
   at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
   at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType)
   at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Volo.Abp.Data.DataSeeder.SeedAsync(DataSeedContext context)
   at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous(IInvocation invocation, IInvocationProceedInfo proceedInfo)
   at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapter.ProceedAsync()
   at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
   at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
   at YuXiang.Ticket.TicketTestBaseModule.<>c__DisplayClass3_0.<<SeedTestData>b__0>d.MoveNext() in D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.TestBase\TicketTestBaseModule.cs:line 55
--- End of stack trace from previous location where exception was thrown ---
   at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task)
   at Nito.AsyncEx.AsyncContext.<>c__DisplayClass15_0.<Run>b__0(Task t)
   at System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke()
   at System.Threading.Tasks.Task.<>c.<.cctor>b__274_0(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location where exception was thrown ---
   at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task)
   at Nito.AsyncEx.AsyncContext.Run(Func`1 action)
   at Volo.Abp.Threading.AsyncHelper.RunSync(Func`1 action)
   at YuXiang.Ticket.TicketTestBaseModule.SeedTestData(ApplicationInitializationContext context) in D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.TestBase\TicketTestBaseModule.cs:line 51
   at YuXiang.Ticket.TicketTestBaseModule.OnApplicationInitialization(ApplicationInitializationContext context) in D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.TestBase\TicketTestBaseModule.cs:line 46
   at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.Initialize(ApplicationInitializationContext context, IAbpModule module)
   at Volo.Abp.Modularity.ModuleManager.InitializeModules(ApplicationInitializationContext context)

Autofac.Core.DependencyResolutionException
An exception was thrown while invoking the constructor 'Void .ctor(Castle.DynamicProxy.IInterceptor[], Volo.Abp.Identity.IdentityUserStore, Volo.Abp.Identity.IIdentityRoleRepository, Volo.Abp.Identity.IIdentityUserRepository, Microsoft.Extensions.Options.IOptions`1[Microsoft.AspNetCore.Identity.IdentityOptions], Microsoft.AspNetCore.Identity.IPasswordHasher`1[Volo.Abp.Identity.IdentityUser], System.Collections.Generic.IEnumerable`1[Microsoft.AspNetCore.Identity.IUserValidator`1[Volo.Abp.Identity.IdentityUser]], System.Collections.Generic.IEnumerable`1[Microsoft.AspNetCore.Identity.IPasswordValidator`1[Volo.Abp.Identity.IdentityUser]], Microsoft.AspNetCore.Identity.ILookupNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber, System.IServiceProvider, Microsoft.Extensions.Logging.ILogger`1[Volo.Abp.Identity.IdentityUserManager], Volo.Abp.Threading.ICancellationTokenProvider, Volo.Abp.Identity.IOrganizationUnitRepository, Volo.Abp.Settings.ISettingProvider)' on type 'IdentityUserManagerProxy'.
   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
   at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.CreateInstance(IEnumerable`1 parameters)

System.InvalidOperationException
SqliteConnection does not support nested transactions.
   at Microsoft.Data.Sqlite.SqliteConnection.BeginTransaction(IsolationLevel isolationLevel)
   at Microsoft.Data.Sqlite.SqliteConnection.BeginDbTransaction(IsolationLevel isolationLevel)
   at System.Data.Common.DbConnection.BeginTransaction(IsolationLevel isolationLevel)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransaction(IsolationLevel isolationLevel)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransaction()
   at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.BeginTransaction()
   at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider`1.CreateDbContextWithTransaction(IUnitOfWork unitOfWork)
   at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider`1.CreateDbContext(IUnitOfWork unitOfWork)
   at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider`1.CreateDbContext(IUnitOfWork unitOfWork, String connectionStringName, String connectionString)
   at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider`1.<>c__DisplayClass3_0.<GetDbContext>b__0()
   at System.Collections.Generic.AbpDictionaryExtensions.<>c__DisplayClass6_0`2.<GetOrAdd>b__0(TKey k)
   at System.Collections.Generic.AbpDictionaryExtensions.GetOrAdd[TKey,TValue](IDictionary`2 dictionary, TKey key, Func`2 factory)
   at System.Collections.Generic.AbpDictionaryExtensions.GetOrAdd[TKey,TValue](IDictionary`2 dictionary, TKey key, Func`1 factory)
   at Volo.Abp.Uow.UnitOfWork.GetOrAddDatabaseApi(String key, Func`1 factory)
   at Volo.Abp.Uow.EntityFrameworkCore.UnitOfWorkDbContextProvider`1.GetDbContext()
   at Volo.Abp.Domain.Repositories.EntityFrameworkCore.EfCoreRepository`2.get_DbContext()
   at Volo.Abp.Domain.Repositories.EntityFrameworkCore.EfCoreRepository`2.get_DbSet()
   at Volo.Abp.SettingManagement.EntityFrameworkCore.EfCoreSettingRepository.GetListAsync(String providerName, String providerKey)
   at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
   at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
   at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
   at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
   at Volo.Abp.SettingManagement.SettingManagementStore.SetCacheItemsAsync(String providerName, String providerKey, String currentName, SettingCacheItem currentCacheItem)
   at Volo.Abp.SettingManagement.SettingManagementStore.GetCacheItemAsync(String name, String providerName, String providerKey)
   at Volo.Abp.SettingManagement.SettingManagementStore.GetOrNullAsync(String name, String providerName, String providerKey)
   at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
   at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
   at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
   at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
   at Volo.Abp.Settings.UserSettingValueProvider.GetOrNullAsync(SettingDefinition setting)
   at Volo.Abp.Settings.SettingProvider.GetOrNullValueFromProvidersAsync(IEnumerable`1 providers, SettingDefinition setting)
   at Volo.Abp.Settings.SettingProvider.GetOrNullAsync(String name)
   at Volo.Abp.Settings.SettingProviderExtensions.GetAsync[T](ISettingProvider settingProvider, String name, T defaultValue)
   at Volo.Abp.Identity.AbpIdentityOptionsFactory.OverrideOptionsAsync(IdentityOptions options)
   at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task)
   at Nito.AsyncEx.AsyncContext.<>c__DisplayClass15_0.<Run>b__0(Task t)
   at System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke()
   at System.Threading.Tasks.Task.<>c.<.cctor>b__274_0(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location where exception was thrown ---
   at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task)
   at Nito.AsyncEx.AsyncContext.Run(Func`1 action)
   at Volo.Abp.Threading.AsyncHelper.RunSync(Func`1 action)
   at Volo.Abp.Identity.AbpIdentityOptionsFactory.OverrideOptions(IdentityOptions options)
   at Volo.Abp.Identity.AbpIdentityOptionsFactory.Create(String name)
   at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.<Get>b__0()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions)
   at Microsoft.Extensions.Options.OptionsManager`1.Get(String name)
   at Microsoft.Extensions.Options.OptionsManager`1.get_Value()
   at Microsoft.AspNetCore.Identity.UserManager`1..ctor(IUserStore`1 store, IOptions`1 optionsAccessor, IPasswordHasher`1 passwordHasher, IEnumerable`1 userValidators, IEnumerable`1 passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger`1 logger)
   at Volo.Abp.Identity.IdentityUserManager..ctor(IdentityUserStore store, IIdentityRoleRepository roleRepository, IIdentityUserRepository userRepository, IOptions`1 optionsAccessor, IPasswordHasher`1 passwordHasher, IEnumerable`1 userValidators, IEnumerable`1 passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger`1 logger, ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, ISettingProvider settingProvider)
   at Castle.Proxies.IdentityUserManagerProxy..ctor(IInterceptor[] , IdentityUserStore store, IIdentityRoleRepository roleRepository, IIdentityUserRepository userRepository, IOptions`1 optionsAccessor, IPasswordHasher`1 passwordHasher, IEnumerable`1 userValidators, IEnumerable`1 passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger`1 logger, ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, ISettingProvider settingProvider)
   at lambda_method(Closure , Object[] )
   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
@maliming
Copy link
Member

maliming commented Nov 4, 2020

SqliteConnection does not support nested transactions. This is expected.

  • Steps needed to reproduce the problem.

@RayMMond
Copy link
Contributor Author

RayMMond commented Nov 4, 2020

Just run dotnet test command in my solution directory, I will try to make a repo to reproduce the problem.
And some additional log from dotnet test command:

....

   at Volo.Abp.Identity.IdentityUserManager..ctor(IdentityUserStore store, IIdentityRoleRepository roleRepository, IIdentityUserRepository userRepository, IOptions`1 optionsAccessor, IPasswordHasher`1 passwordHasher, IEnumerable`1 userValidators, IEnumerable`1 passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger`1 logger, ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, ISettingProvider settingProvider)
   at Castle.Proxies.IdentityUserManagerProxy..ctor(IInterceptor[] , IdentityUserStore store, IIdentityRoleRepository roleRepository, IIdentityUserRepository userRepository, IOptions`1 optionsAccessor, IPasswordHasher`1 passwordHasher, IEnumerable`1 userValidators, IEnumerable`1 passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger`1 logger, ICancellationTokenProvider cancellationTokenProvider, IOrganizationUnitRepository organizationUnitRepository, ISettingProvider settingProvider)
   at lambda_method(Closure , Object[] )
   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()

测试运行失败。
测试总数: 11
     通过数: 1
     失败数: 10
总时间: 8.7265 秒
   9:6>C:\Program Files\dotnet\sdk\3.1.403\Microsoft.TestPlatform.targets(32,5): error MSB4181: “Microsoft.TestPlatform.Build.Tasks.VSTestTask”任务返回了 false,但未记录错误。 [D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.Application.Tests\YuXiang.Ticket.Application.Tests.csproj]
       已完成执行任务“Microsoft.TestPlatform.Build.Tasks.VSTestTask”的操作 - 失败。
   9:6>已完成在项目“YuXiang.Ticket.Application.Tests.csproj”中生成目标“VSTest”的操作 - 失败。
   9:6>已完成生成项目“D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.Application.Tests\YuXiang.Ticket.Application.Tests.csproj”(VSTest 个目标)的操作 - 失败。
   1:2>已完成执行任务“MSBuild”的操作 - 失败。
   1:2>已完成在项目“YuXiang.Ticket.sln”中生成目标“VSTest”的操作 - 失败。
   1:2>已完成生成项目“D:\raymond\repo\YuXiang.Ticket\YuXiang.Ticket.sln”(VSTest 个目标)的操作 - 失败。

生成失败。

       “D:\raymond\repo\YuXiang.Ticket\YuXiang.Ticket.sln”(VSTest 目标) (1:2) ->
       “D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.Application.Tests\YuXiang.Ticket.Application.Tests.csproj”(VSTest 目标) (9:6) ->
       (VSTest 目标) ->
         C:\Program Files\dotnet\sdk\3.1.403\Microsoft.TestPlatform.targets(32,5): error MSB4181: “Microsoft.TestPlatform.Build.Tasks.VSTestTask”任务返回了 false,但未记录错误。 [D:\raymond\repo\YuXiang.Ticket\test\YuXiang.Ticket.Application.Tests\YuXiang.Ticket.Application.Tests.csproj]

    0 个警告
    1 个错误

@RayMMond
Copy link
Contributor Author

RayMMond commented Nov 4, 2020

@maliming Out of my curiosity,

SqliteConnection` does not support nested transactions is expected

means the exception should or should not be thrown?

@maliming
Copy link
Member

maliming commented Nov 4, 2020

The exception should be thrown, Because it does not support nested transactions.

@RayMMond
Copy link
Contributor Author

RayMMond commented Nov 4, 2020

@maliming I figured out after deleting some of my code, and found out that when you register a AsyncPeriodicBackgroundWorker and it's Timer.RunOnStart = true; , you will get this error when unit testing.
Clone my repo and run dotnet test to see the errors.
I have no idea why AsyncPeriodicBackgroundWorker will cause this error... It's just no connection between the error message and AbpTimer.

@RayMMond
Copy link
Contributor Author

RayMMond commented Nov 4, 2020

@maliming
Copy link
Member

maliming commented Nov 4, 2020

Volo.Abp.AbpException : Period should be set before starting the timer!

image

@RayMMond
Copy link
Contributor Author

RayMMond commented Nov 4, 2020

Yes, the root cause of this error is my background worker. And unit test framework gives me totally irrelevant info...

Closing this now, but maybe we should add

            Configure<AbpBackgroundWorkerOptions>(options =>
            {
                options.IsEnabled = false;
            });

in TicketTestBaseModule's ConfigureServices method, just like

            Configure<AbpBackgroundJobOptions>(options =>
            {
                options.IsJobExecutionEnabled = false;
            });

@RayMMond RayMMond closed this as completed Nov 4, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants