Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 正在DRF中多次调用setUpClass()_Django - Fatal编程技术网

Django 正在DRF中多次调用setUpClass()

Django 正在DRF中多次调用setUpClass(),django,Django,也许我缺少逻辑,但我想在模型中添加两条唯一的记录,然后在API上运行测试。但是我的API有问题。get()返回了2条记录,导致了错误。我注意到错误发生在我的.post()检查中,而get方法工作正常。是虫子吗 只有当我用.get()更改self.client.post时,它才不会抱怨 我尝试过setUpTestData(),因为我的数据库支持事务,但没有效果。本质上,我想尝试get方法和post方法。所有get操作都通过了,但在后测试中失败了 class ResetPwdTest(APITest

也许我缺少逻辑,但我想在模型中添加两条唯一的记录,然后在API上运行测试。但是我的API有问题。get()返回了2条记录,导致了错误。我注意到错误发生在我的.post()检查中,而get方法工作正常。是虫子吗

只有当我用.get()更改self.client.post时,它才不会抱怨

我尝试过setUpTestData(),因为我的数据库支持事务,但没有效果。本质上,我想尝试get方法和post方法。所有get操作都通过了,但在后测试中失败了

class ResetPwdTest(APITestCase):
    """ Test module for resetting forgotten password """

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.valid_payload = '1234567890ABCDEF'

        cls.expired_payload = '1234567ACDES'

        cls.invalid_payload = 'invalid0000'
        user_info = {'first_name': 'John', 'email': 'kmsium@gmail.com','password' : 'kigali11', 'status': 1}

        user = User.objects.create_user(**user_info)

        PasswordReset.objects.all().delete() # delete any possible we have but having no effect so far

        # create valid password token
        password2 = PasswordReset(profile_id=user.id, unique_code=cls.valid_payload)
        password2.save()

        # create an expired passwod token

        password = PasswordReset(profile_id=user.id, unique_code=cls.expired_payload)
        password.save()

        password.createdon = '2018-01-12 21:11:38.997207'
        password.save()




    def test_valid_token(self):
        """
        GET Ensure a valid forgotten password reset token returns 200
        WORKING
        """
        response = self.client.get(reverse('new-pwd', kwargs= {'token' : self.valid_payload}))
        self.assertEqual(response.status_code, 200)


    def test_expired_token(self):
        """
        GET Ensure an expired token to reset a forgotten password returns 400
        WORKING
        """
        response = self.client.get(reverse('new-pwd', kwargs= {'token' : self.expired_payload}))
        self.assertEqual(response.status_code, 400)


    def test_invalid_token(self):
        """
        GET Ensure an invali token to reset a forgotten password returns 400
        WORKING
        """
        response = self.client.get(reverse('new-pwd', kwargs= {'token' : self.invalid_payload}))
        self.assertEqual(response.status_code, 400)


    def test_valid_token_change_pass(self):
        """
        POST Ensure a valid forgotten password with accepted passwords pass reset token returns 200
        FAILING BECAUSE TOKEN is not unique
        """

        passwords = {'pwd': 'letmein11', 'pwd_confirm': 'letmein11'}
        response = self.client.post(reverse('new-pwd', kwargs= {'token' : self.valid_payload}), passwords, format='json')
        self.assertEqual(response.status_code, 200)
观点:

class ResetPwd(APIView):

    permission_classes = []

    def get(self,request,token,format=None):

        status = 400
        reply = {}

        check_token = PasswordReset.objects.values('createdon','profile_id',).get(unique_code=token)
        # exists but is it valid or not? It cant be

        createdon = check_token["createdon"]

        if createdon > timezone.now() - timedelta(hours=USER_VALUES['PWD_RESET_LIFESPAN']):
            status = 200
            reply['detail'] = True
        else:
            reply['detail'] = _('errorPwdResetLinkExpired') 

        return JsonResponse(reply,status=status)


    def post(self,request,token,format=None):
        '''
        @input pwd: password
        @input pwd_confirm : confirmation password
        '''

        status = 400
        reply = {}

        k = PasswordReset.objects.filter(unique_code= token).count()
        print('total in db ', k) # shows 1

        check_token = PasswordReset.objects.values('createdon','profile_id',).get(unique_code=token)
        # error: returning 2!
        #exists but is it valid or not? It cant be

        createdon = check_token['createdon']




        if createdon > timezone.now() - timedelta(hours=USER_VALUES['PWD_RESET_LIFESPAN']):
            status = 200
        else:
            reply['detail'] = _('errorPwdResetLinkExpired')

        '''
        except:
            reply['detail'] = _('errorBadPwdResetLink')
        '''

        return JsonResponse(reply,status=status)

我希望所有的测试都能通过。

您的get和post方法是相同的(除了额外的日志记录)。这有关系吗@DanielRoseman?此外,我剥离的部分是密码确实得到了post方法的更改,因为它与我得到的错误无关。既然它们是一样的,它们的行为难道不应该一样吗?