Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to test unmanaged models using pytest-django

In my django project, I have 5 applications, with total 15 models,and all of them are unmanaged. I've written some tests in pytest-django, and when I run them, they fail due to not being able to find tables.

How can I create database entries for all these models so that the tests don't fail?

like image 425
Anmol Garg Avatar asked Dec 22 '25 18:12

Anmol Garg


1 Answers

I was trying to get this to work on Django==4.0.4, pytest-django==4.5.2 and none of the results I could find out there worked for me. This is what I could figure out:

# add this to conftest.py
@pytest.hookimpl(tryfirst=True)
def pytest_runtestloop():
    from django.apps import apps
    unmanaged_models = []
    for app in apps.get_app_configs():
        unmanaged_models += [m for m in app.get_models()
                             if not m._meta.managed]
    for m in unmanaged_models:
        m._meta.managed = True

For this to work you need to add a --no-migrations hook to your pytest settings.

It seems intuitive to think that we can achieve what we need by overriding django_db_setup, and that is the solution provided in other answers on SO. However I was not able to get this to work, that might have something to do with changes to the order of execution of these fixtures over the years, I am not sure.

Excerpt from the current pytest-django docs:

pytest-django calls django.setup() automatically. If you want to do anything before this, you have to create a pytest plugin and use the pytest_load_initial_conftests() hook

Read more

EDIT:

  • Added a note regarding the need to run this without migrations as suggested by @AngryUbuntuNerd
like image 189
wattabak Avatar answered Dec 24 '25 11:12

wattabak



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!