2013-07-01 1 views
0

Tastypie에서 제공하는 API가 포함 된 Django 앱이 있으며 테스트를 작성하려고하면 오류가 발생합니다. 특정 API를 호출합니다. 여기 TastyPie에서 NotFound 예외가 발생하면 Django/Tastypie 테스트 리소스가 실패합니다.

는 (내 로컬 장고 서버 아파치에서 실행까지) CURL 요청입니다 :

curl --dump-header - -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: ApiKey user:025b513834656753db4bd7b32d66ea2e50ea08f3" -X POST --data '{"digest":"123456789123456789"}' "http://localhost/python/api/v1/tracker/" 

이는 (예상) 반응이다 : 나는 실행할 때 다음과 같은, 그러나

HTTP/1.1 404 NOT FOUND 
Date: Mon, 01 Jul 2013 18:15:53 GMT 
Server: Apache/2.2.22 (Ubuntu) 
Vary: Accept-Language,Cookie 
Content-Language: en-us 
Transfer-Encoding: chunked 
Content-Type: application/json 

{ 
    "error_message": "", 
    "traceback": "Traceback (most recent call last):\n\n File \"/home/alex/data/development/home_alexlittle_net/venv/lib/python2.7/site-packages/tastypie/resources.py\", line 217, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/home/alex/data/development/home_alexlittle_net/venv/lib/python2.7/site-packages/tastypie/resources.py\", line 459, in dispatch_list\n return self.dispatch('list', request, **kwargs)\n\n File \"/home/alex/data/development/home_alexlittle_net/venv/lib/python2.7/site-packages/tastypie/resources.py\", line 491, in dispatch\n response = method(request, **kwargs)\n\n File \"/home/alex/data/development/home_alexlittle_net/venv/lib/python2.7/site-packages/tastypie/resources.py\", line 1357, in post_list\n updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs))\n\n File \"/home/alex/data/development/home_alexlittle_net/venv/lib/python2.7/site-packages/tastypie/resources.py\", line 2150, in obj_create\n return self.save(bundle)\n\n File \"/home/alex/data/development/home_alexlittle_net/venv/lib/python2.7/site-packages/tastypie/resources.py\", line 2281, in save\n self.is_valid(bundle)\n\n File \"/home/alex/data/development/django-oppia/oppia/api/resources.py\", line 205, in is_valid\n raise NotFound\n\nNotFound\n" 

시험 자원의 경우 : 나는 다음과 같은 오류가

class TrackerResourceTest(ResourceTestCase): 
    fixtures = ['user.json', 'oppia.json'] 

    def setUp(self): 
     super(TrackerResourceTest, self).setUp() 
     self.username = 'user' 
     user = User.objects.get(username=self.username) 
     api_key = ApiKey.objects.get(user = user) 
     self.api_key = api_key.key 
     self.url = '/api/v1/tracker/' 

    def get_credentials(self): 
     return self.create_apikey(username=self.username, api_key=self.api_key) 

    def test_post_digest_not_found(self): 
     data = { 
      'digest': '123456789123456789', 
     } 
     resp = self.api_client.post(self.url, format='json', data=data, authentication=self.get_credentials()) 
     self.assertHttpNotFound(resp) 

:

====================================================================== 
ERROR: test_post_digest_not_found (oppia.tests.TrackerResourceTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/alex/data/development/django-oppia/oppia/tests.py", line 459, in test_post_digest_not_found 
    resp = self.api_client.post(self.url, format='json', data=data, authentication=self.get_credentials()) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/tastypie/test.py", line 96, in post 
    return self.client.post(uri, **kwargs) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/test/client.py", line 463, in post 
    response = super(Client, self).post(path, data=data, content_type=content_type, **extra) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/test/client.py", line 297, in post 
    return self.request(**r) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/test/client.py", line 406, in request 
    response = self.handler(environ) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/test/client.py", line 111, in __call__ 
    response = self.get_response(request) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/core/handlers/base.py", line 178, in get_response 
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/core/handlers/base.py", line 224, in handle_uncaught_exception 
    return callback(request, **param_dict) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/utils/decorators.py", line 91, in _wrapped_view 
    response = view_func(request, *args, **kwargs) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/views/defaults.py", line 41, in server_error 
    return http.HttpResponseServerError(template.render(Context({}))) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/base.py", line 140, in render 
    return self._render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/test/utils.py", line 65, in instrumented_test_render 
    return self.nodelist.render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/base.py", line 830, in render 
    bit = self.render_node(node, context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/debug.py", line 74, in render_node 
    return node.render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/loader_tags.py", line 124, in render 
    return compiled_parent._render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/test/utils.py", line 65, in instrumented_test_render 
    return self.nodelist.render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/base.py", line 830, in render 
    bit = self.render_node(node, context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/debug.py", line 74, in render_node 
    return node.render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/loader_tags.py", line 156, in render 
    return self.render_template(self.template, context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/loader_tags.py", line 138, in render_template 
    output = template.render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/base.py", line 140, in render 
    return self._render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/test/utils.py", line 65, in instrumented_test_render 
    return self.nodelist.render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/base.py", line 830, in render 
    bit = self.render_node(node, context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/debug.py", line 74, in render_node 
    return node.render(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/templatetags/i18n.py", line 50, in render 
    langs = self.languages.resolve(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/base.py", line 728, in resolve 
    value = self._resolve_lookup(context) 
    File "/home/alex/data/development/home_alexlittle_net/venv/local/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/template/base.py", line 771, in _resolve_lookup 
    (bit, current)) # missing attribute 
VariableDoesNotExist: Failed lookup for key [LANGUAGES] in u"[{'False': False, 'None': None, 'True': True}, {}, {}]" 

그래서 NotFound 예외가 발생했습니다. (?) - 다음 NOTFOUND 예외는 내 API 자원 is_valid 방법으로 발생 내가 같은 암호 같은 오류 메시지가 이유를 알아 내기 위해 사투를 벌인거야

def is_valid(self, bundle, request=None): 
     exists = False 
     try: 
      activity = Activity.objects.get(digest=bundle.obj.digest) 
      exists = True 
     except Activity.DoesNotExist: 
      pass 

     try: 
      media = Media.objects.get(digest=bundle.obj.digest) 
      exists = True 
     except Media.DoesNotExist: 
      pass 
     if not exists: 
      raise NotFound() 

장고 템플릿을보고있는 것 같다,하지만 이후 TastyPie API를 사용하는 경우 앱의이 부분은 템플릿을 사용하지 않습니다. 정보에 대해서는 DEBUG 설정이 True 또는 False로 설정되어 있는지 여부에 관계없이 로컬 서버의 컬 요청에서 동일한 응답을받습니다 (예상대로).

테스트 사례 또는 API 리소스를 작성한 방법에 문제가있어 명확하지 않습니다.

도움이 되셨다면/포인터를 많이 주시면 감사하겠습니다. 테스트가 올바르게 작동하고 싶습니다.

지금은 내가 잘못가는 곳 ... 내가 실수를 몇 만들었다 알아 냈어요

답변

0

: 첫째

을 별도의 검증 클래스에서, 그것은 TrackerResource의 방법이었다입니다되지 않은 is_valid 수업. 나는 이제 그것을 자신의 Validation 클래스로 옮기고 이것을 TrackerResource의 validation = TrackerValidation()으로 참조했다.

둘째, 오류 메시지 집합을 반환하지 않고 NotFound 오류를 반환했습니다. 이제 잘못된 데이터가 전송되면 404 불량 요청 대신 400 잘못된 요청이 표시됩니다. . 지금 내 로컬 사이트에 컬 요청 사이의 일관성있는 결과를 얻을 수 및 테스트 프레임 워크에두고

class TrackerValidation(Validation): 
    def is_valid(self, bundle, request=None): 
     exists = False 
     errors = {} 
     try: 
      activity = Activity.objects.get(digest=bundle.obj.digest) 
      exists = True 
     except Activity.DoesNotExist: 
      pass 

     try: 
      media = Media.objects.get(digest=bundle.obj.digest) 
      exists = True 
     except Media.DoesNotExist: 
      pass 
     if not exists: 
      errors['digest'] = [_(u'Digest not found')] 
     return errors 

: 같은

내 TrackerValidation 클래스는 이제 보인다.

관련 문제