2015-07-01 49 views
0

我只是想测试Flask REST服务的CRUD操作。单元测试REST API Python

  1. CREATE操作中,我想创建一个新的对象。
  2. UPDATE操作中,我需要获取创建操作中创建的对象的id并更新它。
  3. DELETE操作中,我需要删除创建操作中创建的对象。

我该如何解决这个问题?

当前的代码看起来是这样的

class BaseTestCase(TestCase): 
    def create_app(self): 
     return create_app('testing') 

    def setUp(self): 
     self.response = self.client.get('/api/v1/list_portfolios').json 
     self.portfolio_id = self.response['respbody']['Portfolios'][0]['_id'] 
     self.view_response = self.client.get('/api/v1/view_portfolio/' + self.portfolio_id).json 

class ModelTestAPI(BaseTestCase): 
    def test_model_create(self): 
     model_create_data = { 
      "PortfolioId": "558d0e575dddb726b8cd06bc", 
      "ModelName": "New Model", 
      "ModelLifetimePeriod": "Month", 
      "ModelLifetimeDuration": 12 
     } 
     response = self.client.post('/api/v1/model/create', data=dumps(model_create_data), 
            content_type='application/json').json 
     portfolio_model_id = response['respbody']['_id'] 
     print(portfolio_model_id) 

     new_model_dict = model_create_data.copy() 
     new_model_dict['_id'] = portfolio_model_id 

     new_json = response['respbody'].copy() 
     new_json.pop('CreateDate', None) 
     new_json.pop('LastUpdateDate', None) 

     self.assertDictEqual(new_model_dict, new_json) 

    def test_model_update(self): 
     data = { 
      "ModelName": "UPDATE New Model", 
      "ModelLifetimePeriod": "Month", 
      "ModelLifetimeDuration": 6 
     } 
     portfolio_model_id = self.view_response['respbody']['PortfolioModels'][-1]['_id'] 
     json = self.client.put('/api/v1/model/' + portfolio_model_id, data=dumps(data), 
           content_type='application/json').json 

     data['_id'] = portfolio_model_id 
     new_json = json['respbody'].copy() 
     new_json.pop('CreateDate', None) 
     new_json.pop('LastUpdateDate', None) 
     new_json.pop('PortfolioId', None) 

     self.assertDictEqual(data, new_json) 

    def test_model_delete(self): 
     portfolio_model_id = self.view_response['respbody']['PortfolioModels'][-1]['_id'] 
     json = self.client.delete('http://localhost:5000/api/v1/model/' + portfolio_model_id).json 
     expected_dict = {'success': True} 
     self.assertDictEqual(expected_dict, json['respbody']) 
+0

你正在使用什么框架?,以及当前的代码没有做,它应该做什么? –

回答

1

根据我的经验,你首先建立一个Web服务,第二次开始写单元测试

Web服务的例子:

from rest_framework.views import APIView 
class view_example(APIView): 
    def get(self, request, format=None): 
     ... 
    def post(self, request, format=None): 
     ... 
    def put(self, request, format=None): 
     ... 
    def delete(self, request, format=None): 
     ... 

如果您确定在urls.py中注册了视图,那么编写unittest。

from rest_framework.test import APITestCase 

class ViewExampleTests(APITestCase): 
    def test_create(self): 
     ... 
     response = self.client.post(url, data, format='json') 
     ... 
    def test_update(self): 
     ... 
     response = self.client.put(url, data, format='json') 
     ... 
    def test_delete(self): 
     ... 
     response = self.client.delete(url, data, format='json') 
     ... 
    def test_read(self): 
     ... 
     response = self.client.get(url, data, format='json') 
     ... 

但是,这是大幅完成的作品。

+0

也就是说,通过vanilla Django testcast添加了一个'APITestCase'的功能,它需要一个字典并将其编码为您设置为'settings.TEST_REQUEST_DEFAULT_FORMAT'的任何内容。 – spectras