1

Web インターフェイスでフォームを手動で送信しても、実際には機能しますが、次のテスト コードは合格しません。

import os
from flask.ext.testing import TestCase
from flask import url_for

from config import _basedir
from app import app, db
from app.users.models import User


class TestUser(TestCase):

    def create_app(self):
        """
        Required method. Always implement this so that app is returned with context.
        """
        app.config['TESTING'] = True
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(_basedir, 'test.db')
        app.config['WTF_CSRF_ENABLED'] = False  # This must be disabled for post to succeed during tests
        self.client = app.test_client()
        ctx = app.app_context()
        ctx.push()
        return app

    def setUp(self):
        db.create_all()
        #pass

    @app.teardown_appcontext
    def tearDown(self):
        db.session.remove()
        db.drop_all()
        #pass

    def test_admin_home(self):

        # url is the admin home page
        url = url_for('admin.index')
        resp = self.client.get(url)
        self.assertTrue(resp.status_code == 200)

    def test_admin_registration(self):

        url = url_for('admin.register_view')
        data = {'username': 'admin', 'email': 'admin@example.com', 'password': 'admin'}
        resp = self.client.post(url, data)
        self.assertTrue(resp.status_code == 200)

        u = User.query.filter_by(username=u'admin').first()
        self.assertTrue(u.username == 'admin')   # <----- This fails. Why?

テスト クライアントがregister_viewURL に投稿して 200 OK 応答を返した後、テスト データベースから「admin」ユーザーを取得できません。これはなぜですか?

これがビューコードです(これはフラスコ管理ビューです)

from flask import request
from flask.ext.admin import expose, AdminIndexView, helpers

from app.auth.forms import LoginForm, RegistrationForm
from app.users.models import User
from app import db


class MyAdminIndexView(AdminIndexView):

    @expose('/', methods=('GET', 'POST'))
    def index(self):
        # handle user login
        form = LoginForm(request.form)
        self._template_args['form'] = form
        return super(MyAdminIndexView, self).index()

    @expose('/register/', methods=('GET', 'POST'))
    def register_view(self):
        # handle user registration
        form = RegistrationForm(request.form)
        if helpers.validate_form_on_submit(form):
            user = User()
            form.populate_obj(user)
            db.session.add(user)
            db.session.commit()

        self._template_args['form'] = form
        return super(MyAdminIndexView, self).index()
4

1 に答える 1

3

これまでで最もばかげた間違い。

私のテストコードの問題のある行は

resp = self.client.post(url, data)

そのはず

resp = self.client.post(url, data=data)

ipdb.set_trace()クライアントからの不正な POST リクエストが見つかるまで、ロジックを入念に調べて段階的に挿入することで、なんとか追跡することができました。

于 2014-04-09T09:13:39.987 に答える