How can I create models which only required during tests in Django 1.7c1?

573 views
Skip to first unread message

Alisue Lambda

unread,
Jul 16, 2014, 10:17:56 AM7/16/14
to django...@googlegroups.com
Hi all. 

Well today I tried Django 1.7c1 with my program and found that the previous testing strategy seems not work.

I have several models which only required during tests. Before Django 1.7, I could create these kind of temporary models by defining these in `app/tests/models.py` with `app_label` specification like this (https://github.com/lambdalisue/django-permission/blob/master/src/permission/tests/models.py). It was quite good strategy for me because I could reduce the dependency of the apps and make the app independent.

But now, it seems Django 1.7c1 cannot find this kind of definitions. I have to add `app.tests` in `INSTALLED_APPS` which was not required before Django 1.7c1.
However, if I add `app.tests` and `app2.tests`, I have to modify `label` of the `app2.tests` because there is already `app_label='tests'` in the registry. It is quite tough job while I have a lot of apps which follow this strategy to test the app.
Additionally, I don't really want to list `app.tests` in my `INSTALLED_APPS` while it is not actually app which required for the site.

So I wonder if there are any better way to define the temporary models. In summary, what I want to do is

1. I want to add temporary models which only required during tests
2. I don't want to mess the db with temporary models (except during tests)

Any idea? Thank you for your cooperation.


Best regard,

Yo-Yo Ma

unread,
Aug 28, 2014, 8:31:04 PM8/28/14
to django...@googlegroups.com
Ugh... same problem here. It seems you can't really create a model in setUp anymore. I'll post a reply, if I find anything.

Alex Chiaranda

unread,
Aug 29, 2014, 10:57:05 AM8/29/14
to django...@googlegroups.com
Hi, can't you guys mock these models ?

Yo-Yo Ma

unread,
Aug 29, 2014, 11:42:00 AM8/29/14
to django...@googlegroups.com
I use mock for every testcase I have in my app (no queries in my entire test suite), but sometimes I also need to include a real model (but no queries or db), due to the complexity of the situation (e.g., relying on a bit more of Django's inner workings without having to mock 10-15 methods). In other words, despite unit tests being very controlled and specific to a few lines of code, sometimes I need to allow some infrastructure to run, in order to keep my tests simple, and more importantly, to keep them forward compatible.

To reiterate, I'm aware that, in a perfect world, the required components would just be mocked, but for my 9 test methods, I would have more than doubled the length of the tests and been left with an unreadable mess.

Here's the solution I came up with last night, after asking the question: https://gist.github.com/anonymous/a11898d0cd8ffc78b531 (get_model(<appname>, <model>) was messier, due to the need for exception handling).

Alisue Lambda

unread,
Aug 31, 2014, 11:54:34 PM8/31/14
to django...@googlegroups.com
> Alex
Well as Yo-Yo Ma said, sometime the tests stand for testing django's inner working thus the real models are required.

> Yo-Yo Ma
I haven't tried but thanks for the solution :-)
Reply all
Reply to author
Forward
0 new messages