小马 ORM - 在测试中拆除



我正在使用Pony ORM来管理我正在开发的python包中的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 夹具。

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

我无法从数据库中正确"取消绑定",并在第二次测试中收到此错误:

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

我想就最佳方法提供一些建议。 谢谢。

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

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)

查看 Pony 代码,似乎应该足以清除Database实例provider属性以使其新鲜,以便可以再次绑定。

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

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

def unbind_db():
db.provider = db.schema = None

你的夹具应该是这样的:

@fixture
def database() -> None:
setup_db()
...
try:
yield
finally:
unbind_db()

最新更新