Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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
Python 在Django测试中,为什么需要使用<;型号>;。get()而不是<;返回的内容;型号>;。对象。创建()?_Python_Django_Django Rest Framework_Oauth2 Toolkit - Fatal编程技术网

Python 在Django测试中,为什么需要使用<;型号>;。get()而不是<;返回的内容;型号>;。对象。创建()?

Python 在Django测试中,为什么需要使用<;型号>;。get()而不是<;返回的内容;型号>;。对象。创建()?,python,django,django-rest-framework,oauth2-toolkit,Python,Django,Django Rest Framework,Oauth2 Toolkit,虽然这可能不是一个很小的例子,但我正在继续。我有一个模型会话,我希望能够使用Django REST框架对其进行更新。为此,我写了以下观点: from rest_framework import generics from oauth2_provider.contrib.rest_framework import OAuth2Authentication from ..models import Session from ..serializers import SessionSerializ

虽然这可能不是一个很小的例子,但我正在继续。我有一个模型
会话
,我希望能够使用Django REST框架对其进行更新。为此,我写了以下观点:

from rest_framework import generics

from oauth2_provider.contrib.rest_framework import OAuth2Authentication

from ..models import Session
from ..serializers import SessionSerializer


class SessionDetail(generics.UpdateAPIView):
    authentication_classes = [OAuth2Authentication]
    queryset = Session.objects.all()
    serializer_class = SessionSerializer
其中默认的
权限\u类
settings.py
中设置:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}
我编写了以下测试用例:

import json

from django.contrib.auth.models import User
from datetime import timedelta

from django.urls import reverse
from django.test import TestCase, Client
from django.utils import timezone

from rest_framework import status

from ..models import Family, Session, SessionType, SessionCategory

from oauth2_provider.models import get_application_model, get_access_token_model


Application = get_application_model()
AccessToken = get_access_token_model()


class OAuth2TestCase(TestCase):
    def setUp(self):
        self.username = "test_user"
        self.password = "123456"

        self.user = User.objects.create_user(username=self.username, password=self.password)

        self.application = Application(
            name="Test Application",
            redirect_uris="http://localhost",
            user=self.user,
            client_type=Application.CLIENT_CONFIDENTIAL,
            authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE,
        )
        self.application.save()


        self.TOKEN = '1234567890'
        self.token = AccessToken.objects.create(
            user=self.user,
            token=self.TOKEN,
            application=self.application,
            scope='read write',
            expires=timezone.now() + timedelta(days=1)
        )

        self._create_session()

    def _create_session(self):
        self.session_category = SessionCategory.objects.create(
            name='Birth Prep')
        self.session_type = SessionType.objects.create(
            title='Initial Postpartum Lactation',
            category=self.session_category)
        self.family = Family.objects.create()
        self.session = Session.objects.create(
            family=self.family,
            session_type=self.session_type)

    def test_make_patch_request(self):
        data = {'feedback_expert': 'Yes'}
        url = reverse('sessions-feedback', kwargs={'pk': self.session.id})

        auth = f"Bearer {self.TOKEN}"
        response = self.client.patch(
            path=url,
            data=json.dumps(data),
            content_type="application/json",
            HTTP_AUTHORIZATION=auth,
        )

        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertEqual(Session.objects.get(pk=self.session.id).feedback_expert, 'Yes')
        # self.assertEqual(self.session.feedback_expert, 'Yes')
测试通过了,但让我困惑的是,如果我在最后一行评论,而不是

self.assertEqual(self.session.feedback_expert, 'Yes')
我的测试失败了:

(venv) Kurts-MacBook-Pro:lucy-web kurtpeek$ python manage.py test lucy_web.tests.test_feedback
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_make_patch_request (lucy_web.tests.test_feedback.OAuth2TestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/kurtpeek/Documents/Dev/lucy/lucy-web/lucy_web/tests/test_feedback.py", line 295, in test_make_patch_request
    self.assertEqual(self.session.feedback_expert, 'Yes')
AssertionError: '' != 'Yes'
+ Yes

----------------------------------------------------------------------
Ran 1 test in 1.299s

FAILED (failures=1)
Destroying test database for alias 'default'...

显然,
self.session
尚未更新其
feedback\u expert
字段,而
session.objects.get(pk=self.session.id)返回的字段更新了。知道为什么会这样吗?

结果是我需要调用
self.session
。因此,以下工作:

    self.session.refresh_from_db()
    self.assertEqual(self.session.feedback_expert, 'Yes')

现在测试通过了。

结果是我需要调用
self.session
。因此,以下工作:

    self.session.refresh_from_db()
    self.assertEqual(self.session.feedback_expert, 'Yes')
现在测试通过了