Python 小马ORM-测试中的拆卸

Python 小马ORM-测试中的拆卸,python,pytest,ponyorm,Python,Pytest,Ponyorm,在我正在开发的python包中,我使用Pony ORM管理sqlite数据库 我想使用pytest进行测试 我的包提供了一个“代理”对象,用于连接到服务器API并检索“事件”。在初始化代理时,将设置小马orm并将其绑定到sqlite数据库(内存中(用于测试)或作为文件) def setup_db(filepath=None): 如果文件路径: bind(provider=“sqlite”,filename=filepath,create\u db=True) 其他: db.bind(provid

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

我想使用pytest进行测试

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

def setup_db(filepath=None):
如果文件路径:
bind(provider=“sqlite”,filename=filepath,create\u db=True)
其他:
db.bind(provider=“sqlite”,filename=“:memory:”,create_db=True)
db.provider.converter_classes.append((枚举,枚举转换器))
db.generate_映射(create_tables=True)
事件的状态使用pony orm存储在sqlite数据库中

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

@pytest.fixture
def代理():
代理=代理(parm1=“param1”,…)
退货代理
我无法正确地从数据库“解除绑定”,并且在第二次测试中出现此错误:

pony.orm.core.BindingError:数据库对象已绑定到SQLite
提供商

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

我认为对于您的情况,您应该为实体创建一些工厂,并为每个设置创建新的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)

我认为对于您的情况,您应该为实体创建一些工厂,并为每个设置创建新的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)

查看小马代码,似乎清除
数据库
实例的
提供者
属性就足够了,这样它就可以重新绑定了


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

查看小马代码,似乎应该足够清除
数据库
实例的
provider
属性,使其保持新鲜,以便可以再次绑定

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

几乎有效。除了
db.provider
,还需要清除
db.schema
。我的建议是创建另一个函数:

def unbind_db():
db.provider=db.schema=None
你的固定装置应该是这样的:

@fixture
def数据库()->无:
安装程序(db)
...
尝试:
产量
最后:
解除绑定_db()
几乎可以正常工作。除了
db.provider
,还需要清除
db.schema
。我的建议是创建另一个函数:

def unbind_db():
db.provider=db.schema=None
你的固定装置应该是这样的:

@fixture
def数据库()->无:
安装程序(db)
...
尝试:
产量
最后:
解除绑定_db()

谢谢你的回答,但是如果我这样做,我就无法引用代码其他部分中的模型,我可能遗漏了什么?@peteretep所有实体都可以从
db获得。实体
谢谢你的回答,但是如果我这样做,我就无法引用代码其他部分中的模型,我可能遗漏了什么?@peteretep所有实体都可以从
db获得。实体
您还需要清除
模式
db.provider=db.schema=None
对我有效。您还需要清除
schema
db.provider=db.schema=None
对我有效。