lundi 22 décembre 2014

Django unit test - How to assert that a custom Manager calls the UserManager.create_user method?

I'm a newcomer to unit tests and mocking in Python, and in Django too.


Here is my model (simplified):



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 = User.objects.create_user(
username=username,
email=email,
password=password,
first_name=first_name,
last_name=last_name
)
return kanga_user

class KangaUser(models.Model):
objects = KangaUserManager()

user = models.OneToOneField(User)


I would like to assert thet the User.objects.create_user is called, without actually calling it. I see that the mock library is the one to use, I think, but I don't get to anything.


I tried things like that :



def test_create(self):
with mock.patch('django.contrib.auth.models.UserManager') as usermanager_mock:
kangauser_manager = KangaUserManager()
kangauser_manager.create(self.username, self.email, self.password, self.last_name, self.first_name, self.request, self.registered, self.send_confirmation)

self.assertTrue(usermanager_mock.create_user.called)


and that (and many more things I can't remeber :D)



def test_create(self):
with mock.patch('django.contrib.auth.models.User') as user_mock:
user_mock.objects = mock.MagicMock()
user_mock.objects.create_user = mock.MagicMock()

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

self.assertTrue(user_mock.objects.create_user.called)


But I always end up seeing that the method is not called


What am I doing wrong ?


Aucun commentaire:

Enregistrer un commentaire