使用Flask-Login的项目,需要会话的单元测试不适用于项目

问题描述

我在编写烧瓶项目的单元测试时遇到麻烦,在烧瓶项目中烧瓶路径使用用户信息。该视图在探索性测试下可以完美工作,但是在尝试编写单元测试时遇到了问题。

模型


class User(UserMixin,db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(64),unique=True,index=True)
    email = db.Column(db.String(120),index=True)
    role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
    password_hash = db.Column(db.String(128))
    company = db.Column(db.Integer,db.ForeignKey('companies.name'),nullable=True)

    def __repr__(self):
        return '<User %r>' % self.username

class Company(db.Model):
    __tablename__ = 'companies'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(160),unique=True)
    company_about = db.Column(db.Text)
    company_created = db.Column(db.DateTime,index=True,default=datetime.utcNow)
    members = db.relationship('User',backref='users_company',lazy=True)

    def __repr__(self):
        return '<Company %r>' % self.name

查看


@main.route('/create_company',methods=['GET','POST'])
@login_required
def create_company():
    form = CompanyForm()
    if current_user.can(Permission.EDIT) and form.validate_on_submit():
        company = Company(name = form.name.data,company_about = form.company_about.data)
        db.session.add(company)
        current_user.role = Role.query.filter_by(name='Moderator').first()
        current_user.company = company.name
        db.session.commit()
        flash('Your company has been created.')
        return redirect(url_for('.index'))
    return render_template('companies/create_company.html',form=form)

测试

class CompanyViewsTestCase(unittest.TestCase):

    def setUp(self):
        self.app = create_app('testing')
        self.app_context = self.app.app_context()
        self.app_context.push()
        db.create_all()
        Role.insert_roles()
        self.client = self.app.test_client(use_cookies=True)

    def tearDown(self):
        db.session.remove()
        db.drop_all()
        self.app_context.pop()
        
    #### helper methods ####

    def login_user(self,email,password):
        return self.client.post(
            '/auth/login',data=dict(email=email,password=password),follow_redirects=True
        )

    def create_company(self,name,company_about):
        return self.client.post(
            '/create_company',data=dict(name = name,company_about = company_about),follow_redirects=True
        )

    ######

    def test_create_companies_with_flask_session(self):
        role = Role.query.filter_by(name='Organiser').first()
        u = User(forename='John',surname='Smith',username='john_1',email='john@example.com',password='cat',role=role)
        db.session.add(u)
        db.session.commit()
        with self.client as c:
            c.post('/auth/login',data=dict(email='john@example.com',password='cat'),follow_redirects=True)
            response = c.post('/create_company',data=dict(name='Amazing Company',company_about='We are pretty good'),follow_redirects=True)
            self.assertEqual(response.status_code,200)
            self.assertTrue(b'Your company has been created.',response.data)
            company = Company.query.filter_by(name='Amazing Company').first()
            self.assertTrue(company != None)
        
    def test_company_creater_is_Now_member(self):
        role = Role.query.filter_by(name='Organiser').first()
        u = User(forename='John',role=role)
        db.session.add(u)
        db.session.commit()
        assert self.login_user(email='john@example.com',password='cat').status_code == 200
        response = self.create_company(name='Amazing Company',company_about='We are pretty good')
        self.assertEqual(response.status_code,200)
        self.assertTrue(b'Your company has been created.',response.data)
        company = Company.query.filter_by(name='Amazing Company')
        new_role = Role.query.filter_by(name='Moderator').first()
        self.assertTrue(u.users_company == 'Amazing Experiences')
        print(u.role_id)

我尝试使用不同的方法没有成功。我以为在第一个测试中使用flask.session(https://flask.palletsprojects.com/en/1.1.x/testing/#accessing-and-modifying-sessions)可能有用,但是我仍然没有得到我期望的结果。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)