2015-02-24 4 views
4

меня удалить конечную точку, возвращая HTTP 204 Колба test_client не может обрабатывать HTTP 204 Нет данных

@blueprint.route('/foo', methods=['DELETE']) 
def delete_tag(id): 
    # .... 
    return '', 204 

и я хочу, чтобы проверить его

def test_delete_tag(self): 
    resp = self.client.delete(url_for('tags.delete_tag', id=1)) 
    self.assertEqual(resp.status_code, 204) 

, но я получил исключение

Traceback (most recent call last): 
    File "tests/tags_test.py", line 31, in test_delete_tag 
    resp = self.client.delete(url_for('tags.delete_tag', id=1)}) 
    File ".virtualenvs/...site-packages/werkzeug/test.py", line 799, in delete 
    return self.open(*args, **kw) 
    File ".virtualenvs/...site-packages/flask/testing.py", line 108, in open 
    follow_redirects=follow_redirects) 
    File ".virtualenvs/...site-packages/werkzeug/test.py", line 742, in open 
    response = self.run_wsgi_app(environ, buffered=buffered) 
    File ".virtualenvs/...site-packages/werkzeug/test.py", line 659, in run_wsgi_app 
    rv = run_wsgi_app(self.application, environ, buffered=buffered) 
    File ".virtualenvs/.../site-packages/werkzeug/test.py", line 885, in run_wsgi_app 
    buffer.append(next(app_iter)) 
StopIteration 

с откликом 200 он отлично работает. Есть ли способ исправить тест?

+0

Я подтверждаю, что проблема на моей стороне тоже. Добавление 'buffered = True' останавливает проблему, но я не понимаю, почему. –

ответ

1

небольшое приложение колбы:

from flask import Flask, request 
app = Flask(__name__) 

@app.route('/foo', methods=['DELETE']) 
def delete_tag(): 
    print "i got", request.form['id'] 
    return '', 204 

@app.route('/foo2/<id>', methods=['DELETE']) 
def delete_tag2(id): 
    print "i got.. .", id 
    return '', 204 

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

и в IPython qtconsole; я сделал это:

In [3]: from app import app 

In [4]: from flask import url_for 

In [5]: c = app.test_client() 

In [6]: with app.test_request_context(): 
    ...:  rv = c.delete(url_for('delete_tag2', id=55)) 
    ...:  print rv.status_code 
    ...:  
i got.. . 55 
204 

In [7]: rv = c.delete("/foo", data={"id": 555}) 
i got 555 

In [8]: rv.status_code 
Out[8]: 204 
+0

Хммм, поступай так же для меня. Это, по крайней мере, сужает возможные места, где может быть проблема. – farincz