From 8858135043a42df9f0728eb548d3272b476100b6 Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 23 May 2017 11:50:14 -0700 Subject: [PATCH] Update testing.rst --- docs/testing.rst | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/docs/testing.rst b/docs/testing.rst index 67b8aaea..c00d06e0 100644 --- a/docs/testing.rst +++ b/docs/testing.rst @@ -47,17 +47,23 @@ the application for testing and initializes a new database.:: import os import tempfile + import pytest + from flaskr import flaskr + @pytest.fixture def client(request): db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp() flaskr.app.config['TESTING'] = True client = flaskr.app.test_client() + with flaskr.app.app_context(): flaskr.init_db() + yield client + os.close(db_fd) os.unlink(flaskr.app.config['DATABASE']) @@ -77,8 +83,8 @@ low-level file handle and a random file name, the latter we use as database name. We just have to keep the `db_fd` around so that we can use the :func:`os.close` function to close the file. -To delete the database after the test, we close the file and remove it -from the filesystem. +To delete the database after the test, the fixture closes the file and removes +it from the filesystem. If we now run the test suite, we should see the following output:: @@ -107,6 +113,7 @@ test function to :file:`test_flaskr.py`, like this:: def test_empty_db(client): """Start with a blank database.""" + rv = client.get('/') assert b'No entries here so far' in rv.data @@ -148,6 +155,7 @@ Add the following two functions to your :file:`test_flaskr.py` file:: password=password ), follow_redirects=True) + def logout(client): return client.get('/logout', follow_redirects=True) @@ -155,17 +163,18 @@ Now we can easily test that logging in and out works and that it fails with invalid credentials. Add this new test function:: def test_login_logout(client): - """Make sure login and logout works""" - rv = login(client, flaskr.app.config['USERNAME'], - flaskr.app.config['PASSWORD']) + """Make sure login and logout works.""" + + rv = login(client, flaskr.app.config['USERNAME'], flaskr.app.config['PASSWORD']) assert b'You were logged in' in rv.data + rv = logout(client) assert b'You were logged out' in rv.data - rv = login(client, flaskr.app.config['USERNAME'] + 'x', - flaskr.app.config['PASSWORD']) + + rv = login(client, flaskr.app.config['USERNAME'] + 'x', flaskr.app.config['PASSWORD']) assert b'Invalid username' in rv.data - rv = login(client, flaskr.app.config['USERNAME'], - flaskr.app.config['PASSWORD'] + 'x') + + rv = login(client, flaskr.app.config['USERNAME'], flaskr.app.config['PASSWORD'] + 'x') assert b'Invalid password' in rv.data Test Adding Messages @@ -175,9 +184,9 @@ We should also test that adding messages works. Add a new test function like this:: def test_messages(client): - """Test that messages work""" - login(client, flaskr.app.config['USERNAME'], - flaskr.app.config['PASSWORD']) + """Test that messages work.""" + + login(client, flaskr.app.config['USERNAME'], flaskr.app.config['PASSWORD']) rv = client.post('/add', data=dict( title='', text='HTML allowed here' @@ -207,11 +216,9 @@ For more complex tests with headers and status codes, check out the `MiniTwit Example`_ from the sources which contains a larger test suite. - .. _MiniTwit Example: https://github.com/pallets/flask/tree/master/examples/minitwit/ - Other Testing Tricks --------------------