2017-01-18 5 views
8

मान लीजिए मैं (http://flask-restful-cn.readthedocs.io/en/0.3.5/quickstart.html#a-minimal-api से) निम्नलिखित बोतल एपीआई परीक्षण करना चाहते हैं परीक्षण करने के लिए:कैसे इकाई एक फ्लास्क RESTful API

import flask 
import flask_restful 

app = flask.Flask(__name__) 
api = flask_restful.Api(app) 

class HelloWorld(flask_restful.Resource): 
    def get(self): 
     return {'hello': 'world'} 

api.add_resource(HelloWorld, '/') 

if __name__ == "__main__": 
    app.run(debug=True) 

समान निर्देशिका मैं चलाने में flaskapi.py के रूप में इस बचाया और इसे चलाने के बाद, स्क्रिप्ट test_flaskapi.py:

import unittest 
import flaskapi 
import requests 

class TestFlaskApiUsingRequests(unittest.TestCase): 
    def test_hello_world(self): 
     response = requests.get('http://localhost:5000') 
     self.assertEqual(response.json(), {'hello': 'world'}) 


class TestFlaskApi(unittest.TestCase): 
    def setUp(self): 
     self.app = flaskapi.app.test_client() 

    def test_hello_world(self): 
     response = self.app.get('/') 

if __name__ == "__main__": 
    unittest.main() 

दोनों परीक्षण पास है, लेकिन दूसरे टेस्ट वर्ग (TestFlaskApi में परिभाषित) के लिए मैं अभी तक पता लगा नहीं किया है पर जोर करने के लिए कैसे है कि JSON प्रतिक्रिया की उम्मीद के रूप में है (यानी, {'hello': 'world'})। ऐसा इसलिए है क्योंकि यह flask.wrappers.Response का एक उदाहरण है (जो शायद अनिवार्य रूप से वर्कज़ुग रिस्पांस ऑब्जेक्ट (सीएफ http://werkzeug.pocoo.org/docs/0.11/wrappers/) है), और requests 'Response ऑब्जेक्ट के लिए json() विधि के बराबर नहीं मिला है।

मैं दूसरे response की JSON सामग्री पर दावा कैसे कर सकता हूं?

उत्तर

8

मैंने पाया कि मैं get_data() विधि के उत्पादन के json.loads() लगाने से JSON डेटा प्राप्त कर सकते हैं:

import unittest 
import flaskapi 
import requests 
import json 
import sys 

class TestFlaskApiUsingRequests(unittest.TestCase): 
    def test_hello_world(self): 
     response = requests.get('http://localhost:5000') 
     self.assertEqual(response.json(), {'hello': 'world'}) 


class TestFlaskApi(unittest.TestCase): 
    def setUp(self): 
     self.app = flaskapi.app.test_client() 

    def test_hello_world(self): 
     response = self.app.get('/') 
     self.assertEqual(json.loads(response.get_data().decode(sys.getdefaultencoding())), {'hello': 'world'}) 


if __name__ == "__main__": 
    unittest.main() 

दोनों परीक्षण पास के रूप में वांछित:

.. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.019s 

OK 
[Finished in 0.3s] 
+0

"स्थिति: फ्लास्क एपीआई वर्तमान में सक्रिय विकास में नहीं है।" https://github.com/flask-api/flask-api – TheGrimmScientist

2
python3 साथ

, मैं त्रुटि मिली TypeError: the JSON object must be str, not bytes। यह डिकोड करने के लिए की जरूरत है:

# in TestFlaskApi.test_hello_world 
self.assertEqual(json.loads(response.get_data().decode()), {'hello': 'world'}) 

This question एक विवरण देता है।

from source.api import app 
from unittest import TestCase 

class TestIntegrations(TestCase): 
    def setUp(self): 
     self.app = app.test_client() 

    def test_thing(self): 
     response = self.app.get('/') 
     assert <make your assertion here> 

Flask Testing Docs

8

बोतल एक test_client आप अपने परीक्षण में उपयोग कर सकते हैं प्रदान करता है। प्रत्येक मामले में, अनुरोध लाइब्रेरी या फ्लास्क क्लाइंट का उपयोग करते समय, आप integration testing कर रहे हैं क्योंकि आप अंतराल पर वास्तविक http कॉल करते हैं और इंटरैक्शन का परीक्षण करते हैं।

या तो प्रश्न या दृष्टिकोण का शीर्षक सटीक नहीं है।

+0

से (यहां लैंडिंग अन्य लोगों की सहायता करने के लिए उत्तर के रूप में पोस्ट किया गया इन परीक्षणों को लिखने के लिए एक क्लीनर तरीका देखें) – TheGrimmScientist

+0

स्वच्छ और consice। – Prakhar

7

तुम क्या कर रहे हैं वहाँ इकाई परीक्षण नहीं है:

संबंधित मुद्दे