#diesel #test-containers #testing #single #run #proc-macro #migration

已删除 储罐

围绕 diesel 和 testcontainers 的包装,提供了一个单例过程宏,以在容器化的数据库上运行测试。

0.1.0 2022年9月22日

#22#test-containers

MIT 许可证

12KB
101

储罐 🚚

Latest Version GitHub tag (latest by date) Conventional Commits License

储罐是 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