Python Flask单元测试无法为GET请求设置标头

3

我正在尝试在单元测试中设置头请求中的令牌:

def setUp(self):
    #app = Flask(__name__)
    self.app = main.application.test_client()

def login(self):
    payload = {"user": "*******", "password": "******"}
    url ='/user/auth'
    headers = {'Content-Type': 'application/json'}
    response = self.app.post(url, data=json.dumps(payload), headers=headers) 
    result = json.loads(response.data)
    token = str(result["data"]["Token"])
    headers={'Content-Type': 'application/json','Token':token}
    return headers


def GetTool(self):
    headers= self.login()
    return self.app.get('/tool/all',headers=headers,follow_redirects=True)

但是头部信息没有被设置。我知道这一点,因为我正在打印它。如下所示:
@toolAPI.route('/tool/all/', methods=['GET'])
#@authService.authorized
def getAllTools():
   print '*request headers'
   print request.headers
   try:
      ......

这是我在日志中得到的:

8:27:07 [MainThread  ] [INFO ]  ######HTTP MODE######
18:27:07 [MainThread  ] [INFO ]  *request headers
18:27:07 [MainThread  ] [INFO ]  Host: localhost
18:27:07 [MainThread  ] [INFO ]  Content-Length: 0
18:27:07 [MainThread  ] [INFO ]  Content-Type

有什么建议是问题的原因吗?


有没有办法提供一个 [mcve]?我知道这在 Web 方面很困难,但你能做到吗?(对于简洁的问题仍然 +1)。也许通过在代码中硬编码网站响应,以便可以离线运行代码?顺便问一下,app 定义在哪里? - Jean-François Fabre
你为什么认为“头部没有设置”,你到底观察到了什么,以及尝试读取此标头的测试代码是什么?从代码来看,接收/ tool / all可能期望以某种略有不同的方式获得令牌,而不是一个名为“Token”的单独的非标准HTTP标头。 - Peteris
@Jean-FrançoisFabre 我尝试提供了详细信息,请告诉我是否有帮助。 - ilan_pinto
@Peteris 我已经添加了关于标题打印和日志的代码。 - ilan_pinto
2个回答

3
在您的测试文件中。
class TestYourthing(unittest.TestCase):
    def setUp(self):
        self.client = main.app.test_client()
        # get your token from somewhere
        self.headers = {'Content-Type': 'application/json', 'Token': token}

    def test_forbidden_get(self):
        """GET is forbidden for this route."""
        rv = self.client.get('/somewhere', headers=self.headers)
        self.assertEqual(rv.status_code, 404)

    # if you need to update locally the headers for a test

    def test_post_working(self):
        """testing POST for blah"""
        # Adding another header here
        self.headers.update({'X-Blah': 'ping'})
        rv = self.client.post('/somewhere', headers=self.headers)
        self.assertEqual(rv.status_code, 200)

0
我发现可以像这样设置HTTP头:

 client.environ_base['HTTP_ACCEPT'] = 'application/xml'
 response = client.get("/", follow_redirects=True)

客户端似乎在执行请求之前会去掉“HTTP_”前缀。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接