2011-12-20 21 views
27

Bir webhook için son nokta olarak hizmet verecek bir django üzerinde çalışıyorum. Web sayfası, bazı JSON verilerini son noktaya gönderecek ve ardından bu verileri ayrıştıracaktır. Bunun için birim testleri yazmaya çalışıyorum, ancak JSON'u doğru şekilde gönderip göndermediğimden emin değilim.django test istemcisini kullanarak JSON gönderme

ben almaya devam

# tests.py 
from django.test import TestCase 
from django.test.client import Client 
import simplejson 

class TestPipeline(TestCase): 

    def setUp(self): 
     """initialize the Django test client""" 
     self.c = Client() 

    def test_200(self): 
     json_string = u'{"1": {"guid": "8a40135230f21bdb0130f21c255c0007", "portalId": 999, "email": "[email protected]"}}' 
     json_data = simplejson.loads(json_string) 
     self.response = self.c.post('/pipeline-endpoint', json_data, content_type="application/json") 
     self.assertEqual(self.response.status_code, "200") 

ve

# views.py 
from pipeline.prospect import Prospect 
import simplejson 

def pipeline_endpoint(request): 

    #get the data from the json object that came in 
    prospects_json = simplejson.loads(request.raw_post_data) 
    for p in prospects_json: 
     prospect = { 
      'email'   : p['email'], 
      'hs_id'   : p['guid'], 
      'portal'   : p['portalId'], 
     } 

Düzenleme: Bütün geri izleme: Burada

pipeline_endpoint

yılında "TypeError dize endeksleri tamsayılar olmalı" kod.

====================================================================== 
ERROR: test_200 (pipeline.tests.TestPipeline) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "F:\......\pipeline\tests.py", line 31, in test_200 
    self.response = self.c.post('/pipeline-endpoint', json_string, content_type="application/json") 
    File "C:\Python27\lib\site-packages\django\test\client.py", line 455, in post 
    response = super(Client, self).post(path, data=data, content_type=content_type, **extra) 
    File "C:\Python27\lib\site-packages\django\test\client.py", line 256, in post 
    return self.request(**r) 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 111, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "F:\......\pipeline\views.py", line 18, in pipeline_endpoint 
    'email'   : p['email'], 
TypeError: string indices must be integers 

---------------------------------------------------------------------- 
Ran 1 test in 0.095s 

FAILED (errors=1) 
Destroying test database for alias 'default'... 
+0

Lütfen tüm kayıt detaylarını göster –

+0

traceback ile güncellendi! –

+1

Öyleyse ... çünkü json.loads' yerine (string ile) json.dumps' (bir python nesnesiyle) kullanmalısınız, ve böylece müşteri isteğinizle bir python nesnesi üzerinden gönderiyorsunuz. json nesnesi olarak serileştirilmiş bir python nesnesinden daha mı? – mrmagooey

cevap

2

Sen

for index, p in prospects_json.iteritems(): 
    prospect={ 
    'email': p['email'], 
    } 

veya alternatif

for index in prospect_json: 
    prospect={ 
    'email': prospect_json[ index ]['email'] 
    } 
+1

iteritems() hatırlatıcısı için teşekkürler, ancak hala bir JSONDecodeError yaşıyorum. Her şey JSON ile garip görünüyor. –

+0

Hayır, aslında kabukta iyi çalıştı. İzlemenizi güncelleyebilir misiniz? – czarchaic

36

@mrmagooey

def test_your_test(self): 
    python_dict = { 
     "1": { 
      "guid": "8a40135230f21bdb0130f21c255c0007", 
      "portalId": 999, 
      "email": "[email protected]" 
     } 
    } 
    response = self.client.post('/pipeline-endpoint/', 
           json.dumps(python_dict), 
           content_type="application/json") 

kullanım json.dumps yerine doğru döngü sözlüklere kullanıcıyı iteritems olduğunu olabilir json.loads

7

Ham istek verilerini yükleyen her zaman HttpRequest.body kullanabilirsiniz. Bu sayede kendi veri işlemlerinizi gerçekleştirebilirsiniz.

c = Client() 
json_str= json.dumps({"data": {"id": 1}}) 
c.post('/ajax/handler/', data= json_str, content_type='application/json', 
             HTTP_X_REQUESTED_WITH='XMLHttpRequest') 


def index(request): 
    .... 
    print json.loads(request.body) 
6

Dene:

+0

Ayrıca 'GET' ile de çalışır! Teşekkür ederim! – Giordano

1

rest_framework 'ın APIClientJSON için dict damping ilgilenir ve format='json' ileterek uygun içerik türünü belirler.

from rest_framework import status 
from rest_framework.test import APIClient, APITestCase 


class MyTestCase(APITestCase): 
    client_class = APIClient 
    url = '/url' 

    def post(self, payload url=None): 
     """ 
     Helper to send an HTTP post. 

     @param (dict) payload: request body 

     @returns: response 
     """ 
     if url is None: 
      url = self.url 

     return self.client.post(url, payload, format='json') 

    def test_my_function(self): 
     payload = { 
      'key': 'value' 
     } 
     response = self.post(payload) 
     self.assertEqual(status.HTTP_200_OK, response.status_code) 
İlgili konular