#mocking #tdd #proc-macro #test

test_double

测试时替换一种类型为另一种类型的进程宏

4 个版本 (2 个重大更新)

0.3.0 2020 年 2 月 22 日
0.2.0 2019 年 4 月 12 日
0.1.1 2018 年 5 月 1 日
0.1.0 2018 年 5 月 1 日

#750测试

MIT/Apache

20KB
334

test_double Crates.io Rustc 版本 1.31+

一套进程宏,可以在测试时替换为模拟对象、哑对象或其他测试替身。

这并不能解决最初的模拟问题,这值得一看,但它确实允许你轻松地将模拟对象导入到测试中。

使用方法,请将以下内容添加到您的 Cargo.toml

[dependencies]
test_double = "0.3.0"

请注意,此 crate 尚未达到 1.0 版本,因此 API 可能会在发布之间发生变化。

替换单个使用语句

#[test_double] 可以在测试时替换一种类型为另一种类型

#[test_double]
use db::Database;

// Expands to:

#[cfg(not(test))]
use db::Database;
#[cfg(test)]
use db::DatabaseMock as Database;

替换的类型名称默认为原始名称,并在其后面追加 Mock

备用名称

您还可以提供要替换的备用名称

#[test_double(DummyDB)]
use db::Database;

// Expands to:

#[cfg(not(test))]
use db::Database;
#[cfg(test)]
use db::DummyDB as Database;

请注意,这仅在替换单个类型名称时受支持。

前缀

作为快捷方式,如果您想使用原始类型名称,并使用 Mock 作为前缀而不是后缀,可以使用 #[test_double_prefixed]

#[test_double_prefixed]
use db::Database;

// Expands to:

#[cfg(not(test))]
use db::Database;
#[cfg(test)]
use db::MockDatabase as Database;

分组导入

值得注意的是,这些宏还支持分组导入

#[test_double]
use db::{
    Database,
    Connection
};

// Expands to:

#[cfg(not(test))]
use db::Database;
#[cfg(test)]
use db::DatabaseMock as Database;
#[cfg(not(test))]
use db::Connection;
#[cfg(test)]
use db::ConnectionMock as Connection;

限制

对于 #[test_doubles]#[test_doubles_prefixed]

  • 不支持全局导入,例如 use blah::*;
  • 当提供替代替换名称时,不支持分组导入,例如 use blah::{foo, bar};

替换多个使用语句

如果您想一次性替换多个使用语句,可以使用 test_doubles! 宏。请注意,此宏不支持使用替代替换名称,但它支持分组导入,例如 use blah::{foo, bar};

test_doubles! {
    use db::{
        Database, 
        Connection
    };
    use image::ImageCache;
}

// Expands to:

#[cfg(not(test))]
use db::Database;
#[cfg(test)]
use db::DatabaseMock as Database;
#[cfg(not(test))]
use db::Connection;
#[cfg(test)]
use db::ConnectionMock as Connection;
#[cfg(not(test))]
use image::ImageCache;
#[cfg(test)]
use image::ImageCacheMock as ImageCache;

前缀

与单个使用语句宏类似,还有一个 test_doubles_prefixed! 宏可以添加前缀而不是追加

test_doubles_prefixed! {
    use db::Database;
    use image::ImageCache;
}

// Expands to:

#[cfg(not(test))]
use db::Database;
#[cfg(test)]
use db::MockDatabase as Database;
#[cfg(not(test))]
use image::ImageCache;
#[cfg(test)]
use image::MockImageCache as ImageCache;

限制

对于 test_doubles!test_doubles_prefixed!

  • 不支持全局导入,例如 use blah::*;

依赖项

~1.5MB
~36K SLoC