Django单元测试如何断言自定义管理器调用UserManager.create_用户方法?

2024-09-30 01:20:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python和Django中单元测试和mocking的新手。在

这是我的模型(简化版):

from django.db import models
from django.contrib.auth.models import User


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)

我想断言User.objects.create_用户被调用,而不是实际调用它。我不认为我用图书馆是为了得到任何东西。在

我试过这样的方法:

^{pr2}$

还有那个(还有很多我记不清的事情: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)

但我总是看到方法没有被调用

我做错什么了?在

(编辑1:添加了一些导入)

编辑2:

当我按照Alex martelli的建议改编时,我又犯了一个错误

ValueError: Cannot assign "<MagicMock name='User.objects.create_user()' id='55229392'>": "KangaUser.user" must be a "User" instance.

以下是修改后的代码:

from django.db import models
from django.contrib.auth import models as auth_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
        )
        return kanga_user

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

    user = models.OneToOneField(auth_model.User)

Tags: nameselfauthobjectsmodelsemailcreateusername
2条回答

好吧,多亏了亚历克斯和亚伦,我得到了我想要的线索,谢谢!

所以,这是密码

from django.db import models
from django.contrib.auth import models as auth_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
        )
        return kanga_user

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

    user = models.OneToOneField(auth_model.User)

以及有效的测试:

^{pr2}$

使用MagicMock时需要返回一个值。

from unittest.mock import MagicMock

thing = KangaUserManager()
thing.create_user = MagicMock(return_value=True)
self.assertTrue(thing.create_user(**user_kwargs))

相关问题 更多 >

    热门问题