'How to mock users and requests in django

I have django code that interacts with request objects or user objects. For instance something like:

foo_model_instance = models.get_or_create_foo_from_user(request.user)

If you were going to test with the django python shell or in a unittest, what would you pass in there? Here simply a User object will do, but the need for a mock request object also comes up frequently.

For the shell or for unittests:

  • How do you mock users?
  • How do you mock requests?


Solution 1:[1]

How do you mock users?

Initialise a django.contrib.auth.models.User object. User.objects.create_user makes this easy.

How do you mock requests?

Initialise a django.http.HttpRequest object.

Of course, there are shortcuts depending on what you want to do. If you just need an object with a user attribute that points to a user, simply create something (anything) and give it that attribute.

Solution 2:[2]

You can either roll your own mocks, as Anurag Uniyal has suggested, or you can use a mocking framework.

In response to those saying you can just create an ordinary user as you would anyway in Django... I would suggest this defeats the point of the unit test. A unit test shouldn't touch the database, but by creating a user, you've changed the database, hence why we would want to mock one.

Solution 3:[3]

Read about mock objects here
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

And use this python lib to mock a user
http://python-mock.sourceforge.net/

else you can write a simple User class yourself, use this as a starting point

class MockUser(object):
    def __call__(self, *args, **kwargs):
        return self

    def __getattr__(Self, name):
        return self

add specfic cases etc etc

Solution 4:[4]

You don't need to mock Users, as you can just create one within your test - the database is destroyed after the test is finished.

To mock requests, use this snippet from Simon Willison.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Florian
Solution 2 Michael Williamson
Solution 3
Solution 4 Daniel Roseman