我仍然在这里回答有关 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_called_with) 没问题,但对于第二个,我总是以“AssertionError: False is not true”告终
最佳答案
经过更多的谷歌搜索,我发现了一些有用的东西:
@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 !
关于python - Django - 模拟模型上的保存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27667777/