【问题标题】:Django - Mocking the save method on a modelDjango - 在模型上模拟保存方法
【发布时间】:2015-02-24 09:27:51
【问题描述】:

关于 Django 单元测试的初学者问题我仍然在这里 ^^

我正在尝试测试是否调用了模型的保存函数,而实际上并未调用保存。

这是我要测试的方法:

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

这是测试

@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)

第一个测试(UserMock.objects.create_user.assert_call_with)没问题,但第二个,我总是得到“AssertionError: False is not true”

【问题讨论】:

    标签: python django unit-testing mocking


    【解决方案1】:

    在谷歌搜索之后,我发现了一些可行的方法:

    @mock.patch.object(models.KangaUser, 'save')
    @mock.patch('django.contrib.auth.models.User')
    def test_create(self, user_class_mock, kangauser_save_mock):
        # Mocking configuration
        # User
        user_class_mock.objects = mock.MagicMock()
        user_class_mock.objects.create_user = mock.MagicMock()
        user_class_mock.objects.create_user.return_value = User(id=1)
    
        # 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
        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)
        # KangaUser 
        self.assertTrue(kangauser_save_mock.called)
    

    所以,诀窍是使用 @mock.patch.object !

    【讨论】:

    • 您介意分享一下您用于kangauser_save_mock 的代码吗?我想确保在模拟完成后调用 super .save 方法。
    • 后面没有代码,是mock。它是使用方法的 @mock.patch.object(models.KangaUser, 'save') 注释定义的。
    猜你喜欢
    • 2016-01-21
    • 2013-11-19
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多