使用Flask,pytest和SQLAlchemy将FactoryBoy实例保存到数据库

时间:2019-02-19 19:19:45

标签: flask sqlalchemy pytest factory-boy

我正在使用Flask,pytest,SQLAlchemy和FactoryBoy(与pytest-factoryboy一起使用),并且希望每个测试都有一个独立的数据库。我将基于this blog post by Alex Michael的设置与this correction for defining a db_session() fixture结合使用,该设置将在每次测试后回滚数据库。

这些示例之上的其他因素是使用FactoryBoy。没有它,事情就会按预期工作。测试示例:

import pytest
from myapp.models import Company

@pytest.mark.usefixtures("db_session")
def test_company(db_session):
    c = Company(name="Megacorp")
    db_session.add(c)
    db_session.commit()

    c_from_db = Company.query.filter(name="Megacorp").first()

    assert c == c_from_db

这会将Company保存到数据库并检索它。

但是如果我创建这个工厂:

from factory import Sequence
from factory.alchemy import SQLAlchemyModelFactory
from myapp.models import Company
from myapp.models.shared import db

class CompanyFactory(SQLAlchemyModelFactory):
    name = Sequence(lambda n: "Company %d" % n)

    class Meta:
        model = Company
        sqlalchemy_session = db.session

并在同一测试中使用它,而不是Company类:

import pytest
from myapp.factories import CompanyFactory

@pytest.mark.usefixtures("db_session")
def test_company(db_session):
    c = CompanyFactory.create(name="Megacorp")
    db_session.commit()

    c_from_db = Company.query.filter(name="Megacorp").first()

    assert c == c_from_db

然后c_from_dbNone;它不会将公司保存到数据库中,因此没有可检索的内容。

猜测说工厂的sqlalchemy_session是错误的,但我不知道应该是什么。或者也许是其他东西...?

0 个答案:

没有答案