【发布时间】:2018-05-06 13:55:31
【问题描述】:
Rust 有没有办法从 Vec<String> 创建一个 std::env::Args 以便在 #[test] 函数中使用它?
我希望测试一个以std::env::Args 作为参数的函数,但我不知道如何使用我为测试提供的参数列表创建这样的对象。
我无法从文档、来源或 Google 搜索中找出这一点。
【问题讨论】:
-
你能改变这个函数,让它使用一个通用的
I: Iterator<Item = String>吗?这更容易模拟。 -
@trentcl,很好的解决方法,但这是惯用的 Rust 吗?我必须放弃这个函数期望获取命令行参数的明确意图,转而支持这个函数期望一些生成字符串的通用迭代器使其可测试吗?
-
在你接受的东西中保持通用是要走的路。函数名称可以表明意图,但使用通用输入类型可以保持函数的灵活性。
-
是吗?如果函数的契约是“接受命令行参数”,那么测试它的唯一正确方法是传递命令行参数。您必须放宽合同才能使用任意字符串对其进行测试。 (但我应该提到
IntoIterator而不是Iterator,因为它适用于Vec。) -
除此之外,我倾向于同意 loganfsmyth,但如果出于某种原因在调用者上强制执行“给我命令行参数”很重要,您可以将通用函数及其测试包装在一个模块中并且只公开一个
pub fn,它完全采用Args(并调用通用版本来完成工作)。虽然在这一点上也许你还不如自己打电话给std::env::args(),根本不接受任何争论。
标签: unit-testing rust parameter-passing