【问题标题】:How to test Foreign Keys in Flask with unittest如何使用 unittest 在 Flask 中测试外键
【发布时间】:2021-02-11 22:23:47
【问题描述】:

你好吗?

我需要测试向数据库添加信息,但我不知道如何测试外键与单元测试的集成。 没有我添加 Nullable as false 的信息被添加没有问题 我正在使用 Flask 1.1.2 和 Flask-sqlaclhemy 2.4.4 数据库是mysql。 遵循模型代码:

from app import db

class Client(db.Model):
    __tablename__ = 'clients'
    code = db.Column(db.Integer, primary_key=True, nullable=False)
    name_fantasy = db.Column(db.String(64), index=True, nullable=False)
    contact = db.relationship('ContactClient', backref='client', lazy='dynamic')

class ContactClient(db.Model):
    __tablename__ = 'contacts_clients'
    business_mail = db.Column(db.String(64), primary_key=True)
    ddi = db.Column(db.Integer)
    ddd = db.Column(db.Integer)
    phone = db.Column(db.Integer)
    client_id = db.Column(db.Integer, db.ForeignKey('clients.code'), nullable=False)

测试代码:

import unittest
from app import create_app, db
from app.models.clients import Client, ContactClient, FiscalClient

class ClientModelTestCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app('testing')
        self.app_context = self.app.app_context()
        self.app_context.push()
        db.create_all()

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

    def test_client(self):
        cl1 = Client(code=1, name_fantasy='empresa_test')
        db.session.add(cl1)
        db.session.commit()

    def test_contact(self):
        cl1 = ContactClient(business_mail='empresa_test@example.com', ddi=55, 
                             ddd=11, phone=12345678, client_id=1)
        db.session.add(cl1)
        db.session.commit()

如果你能在这个测试用例中帮助我,我将非常感激

【问题讨论】:

    标签: python mysql flask sqlalchemy python-unittest


    【解决方案1】:

    setUp/tearDown 在每个测试方法之前/之后执行。在您的情况下,它会为每个测试方法创建和删除所有表,因此不会留下任何副作用:测试方法 test_contact 不会看到由 test_client 方法创建的 Client 对象。

    如果您想使用副作用,那么您需要使用setUpClass/tearDownClass 而不是setUp/tearDown

    没有副作用,您需要在每个测试方法中创建所有相关对象,如下所示:

    class ClientModelTestCase(unittest.TestCase):
        def setUp(self):
            ...
    
        def tearDown(self):
            ...
    
        def test_contact(self):
            client = Client(code=1, name_fantasy='empresa_test')
            db.session.add(client)
            contact = ContactClient(business_mail='empresa_test@example.com', ddi=55, 
                                    ddd=11, phone=12345678, client=client)
            db.session.add(contact)
            db.session.commit()
    

    【讨论】:

    • 效果很好。更改 setUp 和 tearDown 还可以更轻松地加快测试速度。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多