If you're creating a bug/problem report, please include followings:
- ABP Framework version: v7.0.0
I updated to abp v7.0.0. I can run my application, however, when running the unit tests I receive following errors randomly for the tests.
Message: Volo.Abp.AbpInitializationException : An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module TestProjectDb.TestProjectDbTestBaseModule, TestProjectDb.TestBase, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null: SqliteConnection does not support nested transactions.. See the inner exception for details. ---- System.InvalidOperationException : SqliteConnection does not support nested transactions.
Stack Trace:
ModuleManager.InitializeModules(ApplicationInitializationContext context)
AbpApplicationBase.InitializeModules()
AbpApplicationWithExternalServiceProvider.Initialize(IServiceProvider serviceProvider)
AbpIntegratedTest1.ctor() TestProjectDbTestBase
1.ctor()
TestProjectDbApplicationTestBase.ctor()
I found https://support.abp.io/QA/Questions/2176/Regarding-Unit-test-issue and replaced the service as described, however, this does not fix my problem. I do understand the problem but dont know how to fix this or what changed between my last v6.0.0 and this version?
15 Answer(s)
-
0
hi
Can you debug the unit test method to confirm the
MyUnitOfWorkManager
is working? -
0
-
0
hi
Can you reproduce the problem in a new template project and share it? liming.ma@volosoft.com
-
0
-
0
ok, I will check it.
-
0
hi
Please try to update your
AddressesDataSeedContributor
.using System; using System.Threading.Tasks; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Uow; using test04012022.Addresses; namespace test04012022.Addresses { public class AddressesDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IAddressRepository _addressRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; public AddressesDataSeedContributor(IAddressRepository addressRepository, IUnitOfWorkManager unitOfWorkManager) { _addressRepository = addressRepository; _unitOfWorkManager = unitOfWorkManager; } public async Task SeedAsync(DataSeedContext context) { if (await _addressRepository.FindAsync(Guid.Parse("a4821c19-b073-4dd4-94c0-299f3712a7ed")) == null) { await _addressRepository.InsertAsync(new Address ( id: Guid.Parse("a4821c19-b073-4dd4-94c0-299f3712a7ed"), firstname: "e60f19e1c89147d4958618eecd2e6" )); } if (await _addressRepository.FindAsync(Guid.Parse("87175640-2b9d-4c28-a1c2-b6aceca4969f")) == null) { await _addressRepository.InsertAsync(new Address ( id: Guid.Parse("87175640-2b9d-4c28-a1c2-b6aceca4969f"), firstname: "b23b24db6d974e7493ef2e1bdb915ed185da359993974b27bd30cb50b0c33c2ea02b782148f845" )); } await _unitOfWorkManager.Current.SaveChangesAsync(); } } }
-
0
Hi, Thanks this works for me. However, for my real project, I have a lot of seed methods. Is there any other way than adding the if condition to every insert statement now? In addition: In my project I have tests like following which fail with the same error. What should I do here?
[Fact] public async Task CreateAsync() { // Arrange var input = new CustomerCreateDto { Name = "bf64c99897834", Street = "30b28c8ff57b464d9bc2f5618f15be1c75930a933aa140cb80f614f124bb3f0461f45", Postcode = "aa2e0879154b4a2bbf78597283eb7e57", City = "5f4242b5aa61476a97c3e5af411cf498521949a2ad2c47edbbbe", Country = "c83c88797e63411f882bdd48759e99e87679b076e154472482c6e885b56830cf82abbd257b894cd0a8588a73ad277e3c7c6d", VATNo = "d6d31592918a4f0f96ee23ad51a87e0ab5b0f1b49ccb41acbf85136106af9ba445de4a676ed14b4db27c63267679c6d8def4", Status = default, State = "76d47ce8de444b898aa5565717a4f154c746171559174f87a9fff21f832690097571c7457c7544b3a3041662529c371a881e" }; // Act var serviceResult = await _customersAppService.CreateAsync(input); // Assert var result = await _customerRepository.FindAsync(c => c.Id == serviceResult.Id); result.ShouldNotBe(null); result.Name.ShouldBe("bf64c99897834"); result.Street.ShouldBe("30b28c8ff57b464d9bc2f5618f15be1c75930a933aa140cb80f614f124bb3f0461f45"); result.Postcode.ShouldBe("aa2e0879154b4a2bbf78597283eb7e57"); result.City.ShouldBe("5f4242b5aa61476a97c3e5af411cf498521949a2ad2c47edbbbe"); result.Country.ShouldBe("c83c88797e63411f882bdd48759e99e87679b076e154472482c6e885b56830cf82abbd257b894cd0a8588a73ad277e3c7c6d"); result.VATNo.ShouldBe("d6d31592918a4f0f96ee23ad51a87e0ab5b0f1b49ccb41acbf85136106af9ba445de4a676ed14b4db27c63267679c6d8def4"); result.Status.ShouldBe(default); result.State.ShouldBe("76d47ce8de444b898aa5565717a4f154c746171559174f87a9fff21f832690097571c7457c7544b3a3041662529c371a881e"); }
-
0
However, for my real project, I have a lot of seed methods. Is there any other way than adding the if condition to every insert statement now?
hi
There is no good way. we have to query first. like:
https://github.com/abpframework/abp/blob/08034310b15e9056c019403f500a507e2b4efbdd/modules/openiddict/app/OpenIddict.Demo.Server/EntityFrameworkCore/ServerDataSeedContributor.cs#L28 https://github.com/abpframework/abp/blob/e3e1779de6df5d26f01cdc8e99ac9cbcb3d24d3c/modules/cms-kit/host/Volo.CmsKit.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs#L68
-
0
Hi,
ok, bit of a shame that I have to rewrite all the tests now.
2 more questions:
- can you tell when the templates for the suite will be adjusted to match your pattern?
- what exactly was changed between the 6.x and the 7.0 that leads to this behavior? Is it due to .NET 7 or what change was there in the abp.io framework?
-
0
Is your AddressesDataSeedContributor class generated by the suite?
I think it should be a change brought by EF Core 7.
-
0
Hi there,
I came through here as I got issues with unit tests on our solution since upgrade to ABP 7 as well, annoying as we need the tests to be validated in our CI/CD.
To make more tests I created a new solution with ABP 7 (Blazor server), then added one entity to generate unit tests.
I then added the FindAsync method before each Insert in the DataSeedContributor contributor class as you said.
I still have errors that come up randomly:
On Application.Tests project, it can be either Create, Delete, Get, GetList. When I use "Run All tests", I have often one of them getting in error with: ---- System.InvalidOperationException : SqliteConnection does not support nested transactions.
Then, either on other projects: EntityFrameworkCore.DomainTests, EntityFrameworkCore.Tests or EntityFrameworkCore.Samples
---- System.NullReferenceException : Object reference not set to an instance of an object.
It's very confusing as sometimes there is no error at all...
My own solution (not the one I created for tests), have exactly the same types of errors. I was wondering if it was because my own environment, but when I run tests on Azure, I got the same errors as well.
-
0
hi christophe.baille
https://support.abp.io/QA/Questions/2176/Regarding-Unit-test-issue
-
0
I saw this tickets yes, but as they are 1 year old I did expect that it would have been fixed on a new project with the last ABP version.
I added this lines:
Configure<AbpUnitOfWorkDefaultOptions>(options => { options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; });
Then it works now. Thanks
-
0
- Is your AddressesDataSeedContributor class generated by the suite?
I have the same problem as @a3x.
The test code is generated by the suite (version 7.0.1).
The tip from @christophe.baille has made it better, but at irregular intervals certain tests still fail. Especially when I run all tests. If I then run the failed test separately, then it works.
-
0
hi
The next 7.x patch version will solve this.
https://github.com/abpframework/abp/pull/15508