Stright
Stright

Reputation: 47

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

Upvotes: 3

Views: 408

Answers (1)

iurisilvio
iurisilvio

Reputation: 4987

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.

Upvotes: 2

Related Questions