小马在测试中被撕裂

2024-03-29 00:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发的python包中使用ponyorm来管理sqlite数据库。你知道吗

我想使用pytest进行测试。你知道吗

我的包提供了一个“代理”对象,用于连接到服务器API并检索“事件”。在初始化代理时,将设置pony orm并将其绑定到sqlite db,可以是内存中的(用于测试),也可以是文件。你知道吗

    def setup_db(filepath=None):
        if filepath:
            db.bind(provider="sqlite", filename=filepath, create_db=True)
        else:
            db.bind(provider="sqlite", filename=":memory:", create_db=True)
        db.provider.converter_classes.append((Enum, EnumConverter))
        db.generate_mapping(create_tables=True)

事件的状态使用pony orm存储在sqlite数据库中。你知道吗

我希望创建一个新的代理对象,每个测试都有一个干净的数据库,因此我在conftest.py文件中使用pytest fixture。你知道吗

    @pytest.fixture
    def agent():
        agent=Agent(parm1="param1",...)
        return agent

我无法从数据库中正确地“解除绑定”,在第二次测试中出现此错误:

pony.orm.core.BindingError: Database object was already bound to SQLite provider

我想要一些关于最好的方法的建议。 谢谢。你知道吗


Tags: 文件对象数据库true代理dbsqlitepytest
2条回答

看看Pony代码,清除provider实例的Database属性就足够了,这样它就可以重新绑定了。你知道吗

如果您产生Agent而不是从fixture返回它,那么在yield语句之后的所有内容都将作为fixture分解代码运行。你知道吗

我认为对于您的情况,您应该为实体创建一些工厂,并为每个设置创建新的db对象。你知道吗

def define_entities(db):
    class Student(db.Entity):
        ...

    class Group(db.Entity):
        ...

所以你可以做一些

def setup_db(filepath=None):
    db = Database()
    if filepath:
        db.bind(provider="sqlite", filename=filepath, create_db=True)
    else:
        db.bind(provider="sqlite", filename=":memory:", create_db=True)
    define_entities(db)
    db.provider.converter_classes.append((Enum, EnumConverter))
    db.generate_mapping(create_tables=True)

相关问题 更多 >