2016-01-21 4 views
2

Я пытаюсь проверить свои функции входа в систему с помощью Flask-Testing. Я следую за Flask docs on testing. Функция test_login() вызывает AttributeError: 'Flask' object has no attribute 'post'. Почему я получаю эту ошибку?Объект «Flask» не имеет атрибута «post» error для теста входа в систему

Traceback (most recent call last): 
    File "/home/lucas/PycharmProjects/FYP/Shares/tutorial/steps/test.py", line 57, in test_login_logout 
rv = self.login('lucas', 'test') <br> <br> 
    File "/home/lucas/PycharmProjects/FYP/Shares/tutorial/steps/test.py", line 47, in login 
return self.app.post('/login', data=dict(
AttributeError: 'Flask' object has no attribute 'post' 
from flask.ext.testing import TestCase 
from flask import Flask 
from Shares import db 
import manage 

class test(TestCase): 

def create_app(self): 

    app = Flask(__name__) 
    app.config['TESTING'] = True 
    return app 

SQLALCHEMY_DATABASE_URI = "sqlite://" 
TESTING = True 

def setUp(self): 
    manage.initdb() 

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

def test_adduser(self): 
    user = User(username="test", email="[email protected]") 
    user2 = User(username="lucas", email="[email protected]") 

    db.session.add(user) 
    db.session.commit() 

    assert user in db.session 
    assert user2 not in db.session 

def login(self, username, password): 
    return self.app.post('/login', data=dict(
     username=username, 
     password=password 
    ), follow_redirects=True) 

def logout(self): 
    return self.app.get('/logout', follow_redirects=True) 

def test_login(self): 
    rv = self.login('lucas', 'test') 
    assert 'You were logged in' in rv.data 

ответ

2

Похоже Flask-Testing магически устанавливает специальный объект приложения клиента на экземпляре TestCase имени self.client. Измените все self.app на self.client, и он должен исправить эту проблему.

Например:

def login(self, username, password): 
    return self.app.post('/login', data=dict(
     username=username, 
     password=password 
    ), follow_redirects=True) 

к:

def login(self, username, password): 
     return self.client.post('/login', data=dict(
      username=username, 
      password=password 
     ), follow_redirects=True) 
+0

Благодаря @jumbopap Однако теперь у меня есть ошибки утверждение: '( Ошибка брошено по строке rv = self.login ('lucas', 'test') Мой маршрут имеет следующее определение: @ app.route ("/ login", methods = ["GET", "POST" ]) def login(): Любые идеи, что может быть неправильным? :) –

+2

Ваше фактическое производственное приложение не тестируется этим набором тестов. Вы создаете совершенно отдельное приложение в 'create_app', которое не имеет маршрута'/login'. Вам нужно будет импортировать свое производственное приложение из любого места, где оно хранится, и вернуть его в метод 'create_app'. – jumbopap

 Смежные вопросы

  • Нет связанных вопросов^_^