所以我想向我的 CLI 应用程序添加测试,但我正在努力用临时数据库替换我的数据库。到目前为止,我已经使用 SQLModel 进行数据库访问,但对于应用程序测试,我想使用原始 SQL 语句断言数据库值。但是,在尝试访问临时数据库时出现连接错误。
sqlite3.OperationalError: unable to open database file
到目前为止,我的计划如下:在我的测试文件中,我将 sqlite uri 替换为将其定向到临时字典中的 sqlite 数据库(使用 pytest tmp_path)。我的假设是,如果我使用 SQLModel 创建该数据库,我稍后就可以使用 sqlite3 访问它。您将在下面找到代码。 (目前,我还没有添加断言。当然,一旦数据库连接工作,就会添加断言)
另外,有没有更好的方法来替换我的实际数据库,或者我在这里所做的事情可以吗?
我的测试文件:
import sqlite3
from typer.testing import CliRunner
from projects import db
from projects.app_typer import app
def temp_db(path):
db.sqlite_url = f"sqlite:///{path}/db.db"
runner = CliRunner()
def test_url_replacement(tmp_path):
temp_db(tmp_path)
assert db.sqlite_url == f"sqlite:///{tmp_path}/db.db"
def test_add_item_to_db(tmp_path):
temp_db(tmp_path)
result = runner.invoke(app, ["add", "public", "-n", "Project", "-p", "00-00"])
con = sqlite3.connect(f"sqlite:///{tmp_path}/db.db")
cur = con.cursor()
db_entry = cur.execute("SELECT * FROM project").fetchone()
print(db_entry)
摘自
db.py
:
from sqlmodel import Field, Session, SQLModel, create_engine, select
sqlite_url = "sqlite:///database.db"
engine = create_engine(sqlite_url)
def create_session_and_db():
SQLModel.metadata.create_all(engine)
摘自
app_typer.py
:
import typer
app = typer.Typer(add_completion=False)
@app.callback(invoke_without_command=True, no_args_is_help=True)
def main():
create_session_and_db()
app.add_typer(add.app, name="add", help="Add a project to the DB.")
如果您直接连接到 sqlite DBI 驱动程序,则应直接传递文件名:
con = sqlite3.connect(f"s/{tmp_path}/db.db")
sqlite:
URL 方案由通用驱动程序使用,例如 SQLAlchemy。