К сожалению, то, что вы делаете, не будет работать, по крайней мере, так, как вы хотите. #[automock]
создает struct
с именем MockPathInterface
. Затем вы можете передать этот тип в функции, которые ожидают чего-то, что реализует PathInterface
. Он не может изменить поведение существующих структур, которые реализуют эту черту, по крайней мере, не напрямую. Вы правильно настроили MockPathInterface
в своих тестах, но ничто не связывает его с PackageFileInfoData
, поэтому он никогда не используется.
Один из способов сделать это - это изменить код для передачи поведение, и затем вы можете передать свое смоделированное поведение. Например:
#[automock]
pub trait PathInterface {
// Encapsulate the is_dir method to make it mockable.
fn is_dir(this_path: &PathBuf) -> bool {
this_path.is_dir()
}
}
pub struct PackageFileIndexData {
archive_root_path: PathBuf,
}
impl PackageFileIndexData {
pub fn new<PI: PathInterface>(archive_root: &str) -> Result<PackageFileIndexData, PackageFileIndexError> {
let archive_root_path = PathBuf::from(archive_root.clone());
if !PI::is_dir(&archive_root_path) {
return Err(PackageFileIndexError::ArchiveRootNotADirectory);
}
Ok(PackageFileIndexData { archive_root_path })
}
}
Обратите внимание, что мы используем параметр generi c в методе new
stati c для передачи в Тип реализации черты. Также обратите внимание, что мы изменили вызов is_dir
для ссылки на этот тип generi c.
Затем вы можете изменить свои тесты, чтобы использовать этот параметр типа (один из примеров ниже):
#[test]
fn test_bad_directory() {
let ctx = MockPathInterface::is_dir_context();
ctx.expect().times(1).returning(|_x| false);
let result = PackageFileIndexData::new::<MockPathInterface>("bad_directory").err().unwrap();
assert_eq!(result, PackageFileIndexError::ArchiveRootNotADirectory);
}
Единственное изменение здесь - это использование оператора turbofi sh (::<>
) для передачи типа в метод new
stati c.
Эти изменения эстетически безобразны, и Я не обязательно рекомендую использовать этот шаблон повсюду - если вам действительно нужно издеваться над таким поведением, это в основном не поддерживается. Но это показывает, как вы можете это сделать, и ограничения насмешек в Rust.