2014-04-09 5 views
1

웹 인터페이스의 양식을 수동으로 제출해도 실제로 작동하지 만 다음 테스트 코드는 통과하지 못합니다. 테스트 클라이언트는 register_view URL에 게시물을 가지고 있으며, 200 OK 응답을 반환 한 후플라스크 테스트 클라이언트 게시물이 데이터베이스에 개체를 생성하지 않습니다.

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': '[email protected]', '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? 

, 나는 테스트 데이터베이스에서 '관리자'사용자를 검색하는 데 실패합니다. 이게 왜 그렇게?

다음은 뷰 코드 (이 플라스크 관리이다) 지금까지

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() 
+0

어떻게 실패합니까? 보기 코드를 공유 할 수 있습니까? – DazWorrall

+0

보기 코드가 추가되었습니다. "self.assertTrue (u.username == 'admin')와 함께 실패합니다. AttributeError : 'NoneType'객체에 'username'속성이 없습니다." –

답변

2

멍청한 실수입니다.

내 테스트 코드의 잘못된 줄은

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

그것은 내가 고심 로직을 걷는 내가 찾아 낼 때까지 단계별로 ipdb.set_trace() 단계를 삽입하여 추적 관리

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

해야한다입니다 내 클라이언트가 만든 잘못된 POST 요청입니다.

+0

Flask 테스트 장치와 비슷한 문제가 발생합니다. 문제를 추적하기 위해 ipdb.set_trace()를 어떻게 사용했는지 설명 할 수 있습니까? – ericso

+0

@ itericso Flask 컨텍스트가 작동하는 방법을 알아 내려고 시도하면서 http://kronosapiens.github.io/blog/2014/08/14/understanding-contexts-in-flask.html. – opyate