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/CAN7EoAYO3N3E7Jrds9sqmnfKOUFHwtdf%3DXMra2WZ3WCiDiJfEw%40mail.gmail.com.

Reply via email to