0.1.0 |
|
---|
#22 在 #test-containers
12KB
101 行
储罐 🚚
储罐是 diesel 和 testcontainers 的包装,提供了一个单例过程宏,以在容器化的数据库上运行测试。
路线图
- mysql 支持
- 重新公开需要的 diesel 功能(chrono、time 等)
用法
# Cargo.toml
citerne = {version = "0.1", features = ["postgres"] }
嵌入 diesel 迁移
您必须提供一个 diesel 迁移目录(相对于您的 crate 根目录)。储罐将设置数据库容器并执行目录中的所有迁移。
#[derive(Insertable)]
#[diesel(table_name = dummy)]
struct NewDummy { value: String }
#[database_container_test(migrations = ["./migrations"])]
fn simple_migrations(conn: &mut PgConnection) -> CiterneResult<()> {
let value = NewDummy { value: "one".to_string() };
let sql_result = diesel::insert_into(dummy::table)
.values(value)
.execute(conn)?;
assert_eq!(sql_result, 1);
Ok(())
}
自定义迁移文件
您可以直接嵌入单个 sql 迁移文件,以在容器化数据库中填充固定数据。
请注意,migrations
执行是有序的,您始终需要先提供 diesel 迁移。
#[database_container_test(migrations = ["./migrations", "./tests/dummy.sql"])]
fn migration_with_data_script(conn: &mut PgConnection) -> CiterneResult<()> {
use crate::schema::dummy::value;
use crate::test::dummy::dsl::dummy;
let dummies: Vec<String> = dummy.select(value).load::<String>(conn)?;
assert_eq!(dummies, vec!["yeah".to_string(), "yo".to_string()]);
Ok(())
}
原始 sql 脚本
或者,如果您的测试需要显示固定数据,可以使用 sql
属性。请注意,您可以将两种方法结合起来。
#[database_container_test(
migrations = ["./migrations"]
sql = r#"
INSERT INTO dummy (value) VALUES ('yeah');
INSERT INTO dummy (value) VALUES ('yo');
"#
)]
fn migration_with_raw_sql_script(conn: &mut PgConnection) -> CiterneResult<()> {
use crate::schema::dummy::value;
use crate::test::dummy::dsl::dummy;
let dummies: Vec<String> = dummy.select(value).load::<String>(conn)?;
assert_eq!(dummies, vec!["yeah".to_string(), "yo".to_string()]);
Ok(())
}
许可证
此存储库中的所有代码均根据 MIT 许可证发布,有关更多信息,请参阅 LICENSE 文件。
依赖关系
~8MB
~156K SLoC