Return 从其测试方法更新了结构?

Return updated struct from its methods for testing?

我正在尝试用 Rust 做一些 TDD,我必须添加一个简单的抽象来制作 多个“后端”的代码不可知论者。后端需要一个初始化函数来设置(它们执行与外部系统的连接), 但我不确定如何测试所有这些。我考虑过以实用的方式来做, 具有带有 init 函数的特征后端,因此实现它的结构 returns 自身的新版本已初始化。

#[cfg_attr(test, automock)]
pub trait Backend: Sized {
    fn init(&self) -> Result<Self, Box<dyn Error>>;
}

使用 mockall crate 进行模拟测试,我可以模拟后端并测试 init 函数是否在需要调用的地方被调用。

我不确定这在 Rust 中是否是一个好的做法。在函数式语言中,return 某些对象的更新版本是常态。这里生锈了,我想知道它是否不理想,我怎么能用另一种方法测试这样的东西。

例如,如果我要移出 init 函数,那么我必须有一个枚举用于可能的后端以进行模式匹配并根据后端的类型执行不同的初始化?我不确定这是更好的解决方案。

我仍在学习 Rust 和测试,所以我很感激任何设计方面的帮助。

为什么 return 自己更新它 in-place?

pub trait Backend {
    fn init(&mut self) -> Result<(), Box<dyn Error>>;
}

但是,最好不要让对象处于 non-initialized 状态,并静态地确保对象始终被初始化。如果您必须在某处实例化它而不是从外部传递它,请使用 builder:

pub trait BackendBuilder {
    type Backend;
    fn build() -> Result<Backend, Box<dyn Error>>
}

pub trait Backend {
  // Always initialized
}