使Flask-Login与unittest一起使用

时间:2018-09-09 21:52:02

标签: python flask python-unittest flask-login

我知道在测试中默认情况下禁用登录。我正在尝试通过将app.config['LOGIN_DISABLED']设置为False来恢复它们。这似乎不起作用,因为current_user仍返回None,但是将在测试文件之外的代码中返回User。

一些相关的代码在下面。我的Flask应用程序对象最初是在应用程序的主__init__.py中创建的,该对象在测试过程中已导入并重新配置。

===========

init .py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager

app = Flask(__name__)
app.config[u'DEBUG'] = settings.debug
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)

===========

tests / base.py

from my_app import app, db
import unittest

class BaseTest(unittest.TestCase):
  def setUp(self):
    app.config['TESTING'] = True
    app.config['LOGIN_DISABLED'] = False
    #app.login_manager._login_disabled = False #doesn't help either
    self.app = app.test_client()
    db.create_all()

===========

tests / test_a.py

from flask_login import current_user
from my_app.tests.base import BaseTest

class MyTests(BaseTest):
  def test_a(self):
    #visit endpoint that calls `login_user(user)`
    #printing `current_user` in that endpoint works, but the following line only returns `None`
    print current_user

注意:绝对应该在打印语句之前登录用户。在端点中使用current_user可以正常工作。

1 个答案:

答案 0 :(得分:0)

原来我的问题是由于测试未使用相同的上下文,所以我的解决方案与herehere相似。 import React, {Component} from 'react'; import { Container, Row, Col } from 'reactstrap'; import TimePicker from 'rc-time-picker'; import './Offers.css'; export default class OffersPage extends Component { constructor(props) { super(props); } render() { return ( <div> <TimePicker></TimePicker> </div> ) } } 现在看起来像:

import 'rc-time-picker/assets/index.css';

import React from 'react';
import ReactDom from 'react-dom';
import moment from 'moment';
import TimePicker from 'rc-time-picker';

ReactDom.render(
  <TimePicker defaultValue={moment()} showSecond={false} minuteStep={15} />
, document.getElementById('__react-content'));

奇怪的是,此更改后,return redirect()->route('home'); tests/test_a.py没关系-都可以删除。