Probably you need to use TransactionTestCase, which is the parent of TestCase instead: https://docs.djangoproject.com/en/3.0/topics/testing/tools/#transactiontestcase That page also mentions a specific problem when using transaction on TestCase: ``` A consequence of this, however, is that some database behaviors cannot be tested within a Django TestCase class. For instance, you cannot test that a block of code is executing within a transaction, as is required when using select_for_update() <https://docs.djangoproject.com/en/3.0/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update>. In those cases, you should use TransactionTestCase. 111
On Tue, May 12, 2020 at 1:59 PM Uri Kogan <[email protected]> wrote: > That not that simple in my case because. I'll show what I mean: > > from django.contrib.auth.models import User > from django.test import TestCase > from rolepermissions.roles import assign_role > > class FooTest(TestCase): > def test_bar(self): > u = User.objects.create_user(username="abc", password="pass") > assign_role(u, "role_admin") > retrieve_and_analyze_view_using_u_credentials() > > I am testing that my permission routines work by creating a user, > assigning permissions to the user, retrieving the view and analyzing it. > That "assign_role" call of django-role-permissions uses > "transaction.atomic". Which, of course, I would not want to change, as this > is an external library. > > So I can't really remove usages of "transaction.atomic" > > > > On Tuesday, May 12, 2020 at 9:48:21 AM UTC+3, Aldian Fazrihady wrote: >> >> When testing django apps, my unit test usually accesses the django app >> via django test client: >> https://docs.djangoproject.com/en/3.0/topics/testing/tools/#the-test-client >> . >> Django test client simulates http access, so my Django tests always run >> my Django code starting from Django views. >> Even though there must be many django app code that has >> `transaction.atomic` inside it, I never need to add `transaction.atomic` in >> my unit test code. >> If I need to simulate initial state by having some data inserted to >> database, I did that either using factoryboy or django ORM framework, but I >> see no point to add `transaction.atomic` to that data initialization code. >> >> On Tue, May 12, 2020 at 12:39 PM Uri Kogan <[email protected]> wrote: >> >>> While this can be done in my code, there are libraries that the project >>> use that have "transaction.atomic" in them. For example, pretty popular >>> django-role-permissions. >>> From what I see in the documentation, there should be no problem to use >>> transactions within transactions in TestCase. >>> >>> On Tuesday, May 12, 2020 at 12:34:50 AM UTC+3, Aldian Fazrihady wrote: >>>> >>>> I don't think the subclass of TestCase need to use transaction.atomic. >>>> Why can't you just remove the transaction.atomic? >>>> >>>> Regards, >>>> >>>> Aldian Fazrihady >>>> http://aldianfazrihady.com >>>> >>>> Pada tanggal Sel, 12 Mei 2020 04.02, Uri Kogan <[email protected]> >>>> menulis: >>>> >>>>> Hello, >>>>> >>>>> I am using TestCase and trying to create an object during test. >>>>> There is a log activated on MySQL server, so I see all the queries >>>>> being executed there. >>>>> >>>>> This "transaction.atomic" sets a SAVEPOINT in the database thinking >>>>> that the transaction is already started. The problem is that there is no >>>>> "TRANSACTION START". So, when exiting "with transaction.atomic()" block >>>>> the >>>>> whole thing crashes with "SAVEPOINT xxx DOES NOT EXIST" >>>>> >>>>> The following states that TestCase "tests within two nested atomic() >>>>> blocks", so it should execute "TRANSACTION START" >>>>> >>>>> https://docs.djangoproject.com/en/3.0/topics/testing/tools/#django.test.TestCase >>>>> >>>>> >>>>> from django.contrib.auth.models import User >>>>> from django.test import TestCase >>>>> >>>>> >>>>> class FooTest(TestCase): >>>>> def test_bar(self): >>>>> with transaction.atomic(): >>>>> user = User.objects.create_user(username="abc", >>>>> password="pass") >>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Django users" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/django-users/ecff11bd-9d35-4130-9d3a-0d48f70af73f%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/django-users/ecff11bd-9d35-4130-9d3a-0d48f70af73f%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Django users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/django-users/3741328a-941b-4864-a20d-5e2d9c4937d5%40googlegroups.com >>> <https://groups.google.com/d/msgid/django-users/3741328a-941b-4864-a20d-5e2d9c4937d5%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> >> >> -- >> Regards, >> >> Aldian Fazrihady >> http://aldianfazrihady.com >> > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/91984522-1535-4f37-8fb8-ae76c7095298%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/91984522-1535-4f37-8fb8-ae76c7095298%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- Regards, Aldian Fazrihady http://aldianfazrihady.com -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAN7EoAbdvA6WHqHEi0%3DbDAwSVs%3DoM6sQqLq85UcmLKZPWXs1Gw%40mail.gmail.com.

