Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask-testing - why the test does fail

I'm trying to write tests for a simple Flask application. Structure of the project is following:

app/
    static/
    templates/
    forms.py
    models.py
    views.py
migrations/
config.py
manage.py
tests.py

tests.py

import unittest
from app import create_app, db
from flask import current_app
from flask.ext.testing import TestCase

class AppTestCase(TestCase):
    def create_app(self):
        return create_app('test_config')

    def setUp(self):
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def test_hello(self):
        response = self.client.get('/')
        self.assert_200(response)

app/init.py

# app/__init__.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from config import config

db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    db.init_app(app)
    return app

app = create_app('default')

from . import views

When I launch the tests, test_hello fails because response.status_code is 404. Tell me, please, how can I fix it? It seems, that app instance doesn't know anything about view functions in the views.py. If it needs the whole code, it can be found here

like image 640
Stright Avatar asked Mar 06 '26 03:03

Stright


1 Answers

Your views.py file mount the routes in the app created in your __init__.py file.

You must bind these routes to your created app in create_app test method.

I suggest you to invert the dependency. Instead the views.py import your code, you can make a init_app to be imported and called from your __init__.py or from the test file.

# views.py
def init_app(app):
    app.add_url_rule('/', 'index', index)
    # repeat to each route

You can do better than that, using a Blueprint.

def init_app(app):
    app.register_blueprint(blueprint)

This way, your test file can just import this init_app and bind the blueprint to the test app object.

like image 67
iurisilvio Avatar answered Mar 10 '26 10:03

iurisilvio



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!