Тестовое создание пользовательского пользователя с использованием DRF - PullRequest
0 голосов
/ 15 апреля 2020

Цель состоит в том, чтобы протестировать создание нового пользовательского пользователя с помощью APITestCase .

В models.py есть два новых класса, наследующих от AbstractBaseUser и BaseUserManager соответственно

class MyUser(AbstractBaseUser):
    objects = MyUserManager()
    class Meta:
        db_table = 'user_entity'

    user_id = models.AutoField(primary_key=True)
    #username = models.CharField(max_length=USERNAME_MAX_LENGTH, unique=True, validators=[validators.validate_username])
    username = models.CharField(max_length=20, unique=True)
    password = models.CharField(max_length=256)
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
    email = models.EmailField(verbose_name='email', max_length=100, unique=True)
    last_access = models.DateField(default=datetime.date.today)
    creation_date = models.DateTimeField(default=timezone.now)
    last_update = models.DateField(default=datetime.date.today)
    user_type = models.IntegerField()
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'user_type']

    def __str__(self):
        return str(self.user_id) + " (%s)" % str(self.email)

    def has_perm(self, perm, obj=None):
        return self.user_type == 0

    def has_module_perms(self, app_label):
        return True

и

class MyUserManager(BaseUserManager):
    def _create_generic_user(self, email, username, password, first_name, last_name, user_type):
        if not username:
            raise ValueError("Username cannot be empty")
        if not email:
            raise ValueError("Email cannot be empty")
        if not first_name:
            raise ValueError("First name cannot be empty")
        if not last_name:
            raise ValueError("Last name cannot be empty")
        if not password:
            raise ValueError("Password cannot be empty")

        user = self.model(
            username=username,
            first_name=first_name,
            last_name=last_name,
            email=self.normalize_email(email),
            user_type=user_type,
            is_staff=user_type == 0,
            is_active=False
        )
        user.set_password(password)
        user.save(user=self._db)
        return user

    def create_user(self, email, username, password, first_name, last_name):
        return self._create_generic_user(email, username, password, first_name, last_name, 2)

    def create_admin(self, email, username, password, first_name, last_name):
        return self._create_generic_user(email, username, password, first_name, last_name, 0)

Затем в serializers.py создали MyUserSerializer для DRF, наследуемого от ModelSerializer

class MyUserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(
            required=True, # make sure email is provided
            validators=[UniqueValidator(queryset=MyUser.objects.all())] # make sure email is unique
            )
    username = serializers.CharField(
            required=True,
            validators=[UniqueValidator(queryset=MyUser.objects.all())],
            min_length=5,
            max_length=20
            )
    password = serializers.CharField(
            write_only=True,
            required=True,
            max_length=256
            )
    first_name = serializers.CharField(
            required=True,
            max_length=25
            )
    last_name = serializers.CharField(
            required=True,
            max_length=25
            )

    def create(self, validated_data):
        user = MyUser.objects.create_user(validated_data['email'], validated_data['username'], validated_data['password'],
        validated_data['first_name'], validated_data['last_name'])
        return user


    class Meta:
        model = MyUser
        fields = ('user_id', 'email', 'username', 'password', 'first_name', 'last_name')

представление с APIView

class MyUserCreate(APIView):
    """ 
    Creates the user. 
    """

    def post(self, request, format='json'):
        serializer = MyUserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            if user:
                return Response(serializer.data, status=status.HTTP_201_CREATED)

и URL-адресами

urlpatterns = [
    url(r'api/users^$', views.MyUserCreate.as_view(), name='user-create'),
]

Начиная с этого, затем продолжалось создание простого теста создания пользователей

class MyUserTest(APITestCase):
    def setUp(self):
        # Create a user
        self.test_user = MyUser.objects.create_user('tiagomartinsperes@gmail.com', 'tiagoperes', 'EWFdfew45te!sadf32', 'Tiago', 'Peres')

        # URL for creating user
        self.create_url = reverse('user-create')

    def test_create_user(self):
        """
        Ensure we can create a new user and a valid token is created with it.
        """
        data = {
            'email': 'cnf32344@zzrgg.com',
            'username': 'andresantos',
            'password': 'test',
            'first_name': 'André',
            'last_name': 'Santos'
        }

        response = self.client.post(self.create_url , data, format='json')

        # Make sure we have two users in the database
        self.assertEqual(MyUser.objects.count(), 2)
        # Return 201
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        # Return the username and email upon successful creation
        self.assertEqual(response.data['email'], data['email'])
        self.assertEqual(response.data['username'], data['username'])
        self.assertFalse('password' in response.data)
        self.assertEqual(response.data['first_name'], data['first_name'])
        self.assertEqual(response.data['last_name'], data['last_name'])

Дело в том, что

python manage.py test

получает следующую ошибку:

Создание тестовой базы данных для псевдонима 'default' ... Проверка системы не выявила никаких проблем (0 отключено). E ======================================================= ===================== ОШИБКА: test_create_user (user.tests.MyUserTest) Убедитесь, что мы можем создать нового пользователя и создать с ним действительный токен. -------------------------------------------------- -------------------- Traceback (последний вызов был последним): файл "C: \ Users \ tiago \ Desktop \ letsgo \ COVID19-be \ django_server \ user \ tests.py ", строка 10, в файле setUp self.test_user = MyUser.objects.create_user ('tiagomartinsperes@gmail.com', 'tiagoperes', 'EWFdfew45te! sadf32', 'Tia go', 'Peres') File" C: \ Users \ tiago \ Desktop \ letsgo \ letsgo \ COVID19-be \ django_server \ user \ models.py ", строка 38, в create_user возвращает self._create_generic_user (электронная почта, имя пользователя, пароль, имя, имя, фамилия, имя файла, 2)" C: \ Users \ tiago \ Desktop \ Let'sgo \ COVID19-be \ django_server \ user \ models.py ", строка 34, в _create_generic_user user.save (user = self._db) Файл" C: \ Users \ tiago \ Desktop \ letsgo \ unstable \ lib \ site-packages \ django \ contrib \ auth \ base_user.py ", строка 66, в save super (). save (* args, ** kwargs) TypeError: save () получил неожиданный аргумент ключевого слова 'user'

-------------------------------------- -------------------------------- Выполнен 1 тест за 0,172 с

СБОЙ (ошибки = 1) Dest Испытательная база данных для псевдонима 'default' ...

и пользователи не создаются. Что я могу сделать, чтобы решить это?

1 Ответ

2 голосов
/ 15 апреля 2020

Проблема здесь

user.save(user=self._db)

django Модель save имеет следующую подпись.

def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):

Поскольку вы передаете базу данных как значение (self._db), Я думаю, что вы должны написать

user.save(using=self._db)
...