【问题标题】:Django Rest Framework - AssertionError in testsDjango Rest Framework - 测试中的 AssertionError
【发布时间】:2015-05-31 18:39:20
【问题描述】:

我对 Django Rest Framework 的测试有疑问。我有以下看法:

class AccountDetail(generics.RetrieveUpdateAPIView):
    model = Account
    serializer_class = AccountSerializer
    lookup_field = 'username'
    permission_classes = (permissions.AllowAny,)
    def get_queryset(self):
        return Account.objects.filter(username=self.kwargs.get('username'))

我的网址包括以下内容:

account_urls = patterns('',
    url(r'^/(?P<username>[0-9a-zA-Z_-]+)/$', AccountDetail.as_view(), name='account-detail'),
    url(r'^/$', AccountList.as_view(), name='account-list')
)

urlpatterns = patterns('',
    url(r'^api/v1/users', include(account_urls)),
)

当我使用可浏览的 API 时,一切正常,但是当我编写以下测试时,我得到一个错误:

class TestAccoundDetail(APITestCase):
    def setUp(self):
        factory = APIRequestFactory()
        #set up normal user and token
        self.normal_user = Account.objects.create_user(email="user@example.com", username="useri", password="man")
        request = factory.post('/api/v1/auth/login/', {'email': 'user@example.com', 'password': 'man'})
        response = obtain_jwt_token(request)
        self.normal_token = response.data['token']

    def test_details(self):
        factory = APIRequestFactory()
        view = AccountDetail.as_view()

        #unauthenticated
        url = reverse('account-detail', kwargs={'username': 'useri'})
        request = factory.get(url)
        response = view(request)
        self.assertEqual(response.status_code, 200)

AssertionError:应使用名为“用户名”的 URL 关键字参数调用视图 AccountDetail。修正您的 URL 配置,或正确设置视图上的 .lookup_field 属性。

URL 看起来不错,并且 lookup_field 就在那里。我错过了什么?

编辑

我改用 APIClient 并且它有效:

        client = APIClient()

        response = client.get('/api/v1/users/useri/')
        self.assertEqual(response.status_code, 200)

但是,我仍然不明白为什么我的原始测试不起作用。

【问题讨论】:

    标签: django django-rest-framework django-testing


    【解决方案1】:

    RequestFactory 用于对视图进行单元测试。它确实绕过了中间件和 url 层。因此,您需要自己提供其他参数,同时使用 ClientFactory urls.py 为您执行此操作。

    编辑: 换句话说,

    response = view(request)
    

    应该是

    response = view(request, "useri")
    

    【讨论】:

      【解决方案2】:

      扩展@linovias 的答案,关键是将额外的参数传递给您的视图

      response = (view, username='useri')
      

      全面测试

      def test_details(self):
          factory = APIRequestFactory()
          view = AccountDetail.as_view()
      
          #unauthenticated
          url = reverse('account-detail', kwargs={'username': 'useri'})
          request = factory.get(url)
      
          response = view(request, username='useri')
      
          self.assertEqual(response.status_code, 200)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-25
        • 2018-05-14
        • 2014-05-29
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        相关资源
        最近更新 更多