Python 小马ORM-测试中的拆卸
在我正在开发的python包中,我使用Pony ORM管理sqlite数据库 我想使用pytest进行测试 我的包提供了一个“代理”对象,用于连接到服务器API并检索“事件”。在初始化代理时,将设置小马orm并将其绑定到sqlite数据库(内存中(用于测试)或作为文件)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
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
对我有效。