6

ずっと愛読しておりましたが、投稿は初めてです。

わかりました。Flask でデモ アプリケーションを単体テストしようとしていますが、何が間違っているのかわかりません。

これらはmanager.pyというファイル内の私の「ルート」です:

@app.route('/')
@app.route('/index')
def hello():
    return render_template('base.html')


@app.route('/hello/<username>')
def hello_username(username):
    return "Hello %s" % username 

最初のルートでは、base.html テンプレートをロードして「hi」メッセージをレンダリングします。これは単体テストで機能しますが、2 番目のルートではアサーション エラーが発生します。

これは私のテストファイルmanage_test.pyです:

class ManagerTestCase(unittest.TestCase):

    def setUp(self):
        self.app = app.test_client()

    def t_username(self, username):
        return self.app.post('/hello/<username>', follow_redirects=True)

    def test_username(self):
        rv = self.t_username('alberto')
        assert "Hello alberto" in rv.data

    def test_empty_db(self):
        rv = self.app.get('/')
        assert 'hi' in rv.data

これは、単体テストの実行からの出力です。

.F
======================================================================
FAIL: test_username (tests.manage_tests.ManagerTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/albertogg/Dropbox/code/Python/flask-bootstrap/tests/manage_tests.py", line 15, in test_username
    assert "Hello alberto" in rv.data
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.015s

FAILED (failures=1)

あなたたちが私を助けることができるかどうか知りたいです!私は何が間違っているか、欠けていますか?

編集

私はこれをしました、そしてそれは働いています

 
    class ManagerTestCase(unittest.TestCase):

    def setUp(self):
        self.app = app.test_client()

    def t_username(self, username):
        return self.app.get('/hello/%s' % (username), follow_redirects=True')
        # either that or the Advanced string formatting from the answer are working.

    def test_username(self):
        rv = self.t_username('alberto')
        assert "Hello alberto" in rv.data

    def test_empty_db(self):
        rv = self.app.get('/')
        assert 'hi' in rv.data

4

1 に答える 1

2

hello_username次のように変更する必要があります。

@app.route('/hello/', methods=['POST'])
def hello_username():
    return "Hello %s" % request.form.get('username', 'nobody')

も確認しfrom flask import requestてください。

そして、それが機能していることを示す例:

> curl -X POST -i 'http://localhost:2000/hello/' -d "username=alberto"
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 9
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Fri, 21 Dec 2012 05:42:49 GMT

Hello alberto

テストは次のようになります。

def test_username(self, username):
    return self.app.post('/hello', data={"username":username})

編集
あなたのコメントごとに:

@app.route('/hello/<username>', methods=['POST'])
def hello_username(username):
    print request.args
    return "Hello %s" % username

しかし、これは本質的に POST 本体のない POST であるため、なぜ POST を使用するのかわかりません。

> curl -X POST -i 'http://localhost:2000/hello/alberto'           
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 13
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Fri, 21 Dec 2012 06:29:25 GMT

Hello alberto

その場合、POST データの要件をまとめて削除します。

@app.route('/hello/<username>', methods=['POST'])
def hello_username(username):
    print request.args
    return "Hello %s" % username


> curl -i 'http://localhost:2000/hello/alberto'           
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 13
Server: Werkzeug/0.8.3 Python/2.7.2
Date: Fri, 21 Dec 2012 06:31:10 GMT

GET を使用したテストは次のようになります。

def test_username(self, username):
    return self.app.get('/hello/%s' % (username), follow_redirects=True)

または、2.6+ を持っていると仮定すると、

def test_username(self, username):
    return self.app.get('/hello/{username}'.format(username=username), follow_redirects=True)
于 2012-12-21T05:43:35.707 に答える