Skip to main content
 首页 » 编程设计

python之APIView 的 GET api 测试用例在 djangorestframework 中不起作用

2025年04月02日56del

我正在 Django 中编写一个关于 GET API 的测试用例。我只想让第一个测试通过。这是我的代码。

class InventoryItemDetailTestCase(APITestCase): 
    """ 
        This is the API test case for the reserve/express detail api 
    """ 
    def setUp(self): 
        self.resource_uri = '/api/v2/inventory/inventory_item_detail/1233/' 
 
    def test_inventory_item_detail_route(self): 
        """ 
            Test to set routing for item_detail 
        """ 
        route = resolve('/api/v2/inventory/inventory_item_detail/1233/') 
        self.assertEqual(route.func.__name__, 'InventoryItemDetails') 
 
    def test_inventory_item_detail_data(self): 
        """ 
            Test case to check the response json of the reserve/express API 
        """ 
        response = self.client.get('/api/v2/inventory/inventory_item_detail/1233/') 
        self.assertEqual(response.status_code, 200) 

这里我使用client.get 来发出请求。但它给了我错误

Creating test database for alias 'default'...

F

FAIL: test_inventory_item_detail_data (inventory.tests.functional_tests.InventoryItemDetailTestCase)

Traceback (most recent call last): File "/Users/chitrankdixit/Documents/work/flyrobe/flyrobe-django/project/inventory/tests/functional_tests.py", line 131, in >test_inventory_item_detail_data self.assertEqual(response.status_code, 200) AssertionError: 400 != 200


Ran 1 test in 0.135s

FAILED (failures=1)

我尝试使用 pdb.set_trace() 来弄清楚会发生什么错误,我在运行时已经弄清楚了

self.client.get('/api/v2/inventory/inventory_item_detail/1233/')

我收到这个错误

*** KeyError: 'content-type'

我试过提供一个额外的参数名称content_type,比如

self.client.get('/api/v2/inventory/inventory_item_detail/1233/', content_type='application/json')

但我仍然得到同样的错误。我能够单独运行 API,并且我的 API 正在获取正确的响应。如果之前有人经历过这个,请告诉我。

请您参考如下方法:

传递给 client.get 的 header 名称应遵循 CGI规范。来自 docs :

The headers sent via **extra should follow CGI specification. For example, emulating a different “Host” header as sent in the HTTP request from the browser to the server should be passed as HTTP_HOST.

这意味着,您应该指定 HTTP_CONTENT_TYPE 而不是 content_type。