【问题标题】:Django model unit testDjango模型单元测试
【发布时间】:2017-12-19 04:15:05
【问题描述】:

我开始学习 Django,但在单元测试中遇到了问题,我试图寻找问题所在,但我无法确定代码中的问题所在。如果有人可以找出我的代码中的问题,或者您可以给我一些建议吗?

错误:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_create_user (user_api.tests.ModelUseProfileTest)
Users can register
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/vagrant/src/api/user_api/tests.py", line 26, in test_create_user
    user = UserProfile.objects.get(id=1)
  File "/home/ubuntu/.virtualenvs/venv/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/ubuntu/.virtualenvs/venv/lib/python3.5/site-packages/django/db/models/query.py", line 379, in get
    self.model._meta.object_name
user_api.models.DoesNotExist: UserProfile matching query does not exist.
----------------------------------------------------------------------
Ran 1 test in 0.040s
FAILED (errors=1)
Destroying test database for alias 'default'...

我的测试:

from django.test import TestCase
from rest_framework import status
from django.core.urlresolvers import reverse
from .models import UserProfile

# Create your tests here.
class ModelUseProfileTest(TestCase):
 """ Test class define the test suite for the UserProfile model."""

    def test_create_user(self):
    """Users can register"""

    # Create an instance of a GET request.
    response = self.client.post("/api/v1/register/", {
      "name": "Walter",
      "lasT_name": "White",
      "email": "heisenberg@email.com", 
      "password": "secret", })

    user = UserProfile.objects.get(id=1)

    self.assertEqual(user.name, "Walter")
    self.assertEqual(user.last_name, "White")
    self.assertEqual(user.email, "heisenberg@email.com")
    self.assertEqual(response.status_code, 201)

我的模特:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.models import BaseUserManager

class UserProfileManager(BaseUserManager):
      """Helps Django work with our custom user model"""
      def create_user(self, name, last_name, email, password=None):
            """Create a new user profile object."""
            if not email:
                  raise ValueError('Users must have an email address.')

            if not name:
                  raise ValueError('Users must have an name.')

            if not last_name:
                  raise ValueError('Users must have an last name.')

            email = normalize_email(email)
            user = self.model(name=name, last_name=last_name, email=email)
            user.set_password(password)
            user.save(using=self._db)

            return user

      def create_superuser(self, name, last_name, email, password=None):
            """Create and saves a new superuser with given details."""

            user = self.create_user(name, last_name, email, password)
            user.is_superuser = True
            user.is_staff = True
            user.save(using=self._db)

            return user

class UserProfile(AbstractBaseUser, PermissionsMixin):
      """Represents a "user profile" inside our system."""

      name = models.CharField(max_length=500)
      last_name = models.CharField(max_length=500)
      email = models.EmailField(max_length=255, unique=True)
      is_active = models.BooleanField(default=True)
      is_staff = models.BooleanField(default=False)
      objects = UserProfileManager()
      USERNAME_FIELD = 'email'
      REQUIRED_FIELDS = ['name', 'last_name']

      def get_full_name(self):
        """Used to get a users full name."""

          return self.name

      def get_short_name(self):
        """Used to get a users short name."""

          return self.name

      def __str__(self):
        """Django uses this when it needs to convert the object to a string"""

          return self.email

【问题讨论】:

  • 使用 UserProfile.objects.latest() 或 UserProfile.objects.all()[:1]

标签: django python-3.x unit-testing django-rest-framework testcase


【解决方案1】:

虽然测试客户端每次都是从一个空白数据库开始,但没有理由假设主键是1;每次运行后清空表时,不会重置序列。您应该只查询第一项,而不是显式获取 pk=1:

 user = UserProfile.objects.first()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2015-06-24
    • 2010-12-26
    相关资源
    最近更新 更多