首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pony ORM --测试中的拆卸

Pony ORM --测试中的拆卸
EN

Stack Overflow用户
提问于 2019-08-25 00:57:06
回答 3查看 793关注 0票数 0

我使用Pony ORM来管理我正在开发的python包中的sqlite数据库。

我想使用pytest进行测试。

我的包提供了一个"agent“对象,用于连接到服务器API并检索”事件“。在代理初始化时,设置小马orm并将其绑定到sqlite db,在内存中(用于测试)或作为文件。

代码语言:javascript
复制
    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 db中。

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

代码语言:javascript
复制
    @pytest.fixture
    def agent():
        agent=Agent(parm1="param1",...)
        return agent

我无法正确地从数据库“解除绑定”,并在我的第二次测试中得到以下错误:

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

我想要一些关于最好的继续进行的方法的建议。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2019-08-27 21:15:25

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

代码语言:javascript
复制
def define_entities(db):
    class Student(db.Entity):
        ...

    class Group(db.Entity):
        ...

这样你就可以像这样做了

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2019-12-11 00:16:28

看一下Pony代码,似乎清除Database实例的provider属性就足够了,这样它就可以再次绑定。

如果您放弃Agent而不是从fixture返回它,那么放在yield语句之后的所有内容都将作为fixture拆卸代码运行。

票数 0
EN

Stack Overflow用户

发布于 2020-07-13 02:13:36

previous answer from zgoda几乎可以正常工作。除了db.provider之外,还需要清除db.schema。我的建议是创建另一个函数:

代码语言:javascript
复制
def unbind_db():
    db.provider = db.schema = None

你的fixture应该是这样的:

代码语言:javascript
复制
@fixture
def database() -> None:
    setup_db()
    ...
    try:
       yield
    finally:
       unbind_db()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57639915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档