Home:ALL Converter>Django - Mocking the save method on a model

Django - Mocking the save method on a model

Ask Time:2014-12-27T21:37:36         Author:CBrunain

Json Formatter

I'm still here with my beginner questions about Django unit tests ^^

I'm trying to test that the save function of a model was called, without actually call the save.

Here is the method i want to test :

from django.db import models
from django.contrib.auth import models as auth_model
from allauth.socialaccount import models as allauth_model

class KangaUserManager(models.Manager):
    def create(self, username, email, password, last_name, first_name, request, registered=True, send_confirmation=True):
        kanga_user = KangaUser()
        kanga_user.user = auth_model.User.objects.create_user(
            username=username,
            email=email,
            password=password,
            first_name=first_name,
            last_name=last_name
        )
        kanga_user.preferred_language = translation.get_language()
        kanga_user.registered = registered
        kanga_user.save()

        return kanga_user

Here is the test

@mock.patch('model.models.KangaUser')
@mock.patch('django.contrib.auth.models.User')
def test_create(self, UserMock, KangaUserMock):
    # Mocking configuration
    # User
    UserMock.objects = mock.MagicMock()
    UserMock.objects.create_user = mock.MagicMock()
    user_return_value = User(id=1)
    UserMock.objects.create_user.return_value = user_return_value

     # Test
    kangauser_manager = models.KangaUserManager()
    kanga_user = kangauser_manager.create(self.username, self.email, self.password, self.last_name, self.first_name, self.request, self.registered, self.send_confirmation)

    # Checks
    # create_user called with good parameters
    UserMock.objects.create_user.assert_called_with(username=self.username, email=self.email, password=self.password, first_name=self.first_name, last_name=self.last_name)
    # KangaUser 
    self.assertTrue(models.KangaUser.save.called)

The first test (UserMock.objects.create_user.assert_called_with) is ok, but for the second, I always end up having "AssertionError: False is not true"

Author:CBrunain,eproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/27667777/django-mocking-the-save-method-on-a-model
CBrunain :

After some more googling, I found something that works :\n\[email protected](models.KangaUser, 'save')\[email protected]('django.contrib.auth.models.User')\ndef test_create(self, user_class_mock, kangauser_save_mock):\n # Mocking configuration\n # User\n user_class_mock.objects = mock.MagicMock()\n user_class_mock.objects.create_user = mock.MagicMock()\n user_class_mock.objects.create_user.return_value = User(id=1)\n\n # Test\n kangauser_manager = models.KangaUserManager()\n kanga_user = kangauser_manager.create(self.username, self.email, self.password, self.last_name, self.first_name, self.request, self.registered, self.send_confirmation)\n\n # Checks\n # create_user called with good parameters\n user_class_mock.objects.create_user.assert_called_with(username=self.username, email=self.email, password=self.password, first_name=self.first_name, last_name=self.last_name)\n # KangaUser \n self.assertTrue(kangauser_save_mock.called)\n\n\nSo, the trick was to use @mock.patch.object !",
2014-12-27T14:39:49
Ange Tresca :

With pytest-mock you can do:\ndef test_create(self, mocker):\n mocker.patch("path_to_the_kanga_user_manager.KangaUser.save")\n\n",
2023-02-27T14:26:20
yy