autospy

Crates.ioautospy
lib.rsautospy
version1.2.0
created_at2025-05-15 13:17:05.242665+00
updated_at2025-09-21 18:35:53.388191+00
descriptionA test spy object library.
homepage
repositoryhttps://github.com/lhalf/autospy
max_upload_size
id1674998
size97,430
(lhalf)

documentation

https://docs.rs/autospy

README

autospy

🎵 autospy record, autospy replace 🎵

Crates.io Version docs.rs GitHub Actions Workflow Status MIT

A test spy object library.

Overview

A test spy is a type of test double used in unit testing. It provides the same interface as the production code, but allows you to set outputs before use in a test and to verify input parameters after the spy has been used.

#[autospy] generates a test spy object for traits.

Usage

The example below demonstrates use in a unit test assuming autospy is included in [dev-dependencies].

#[cfg_attr(test, autospy::autospy)]
trait MyTrait {
    fn foo(&self, x: u32) -> bool;
}

fn use_trait(trait_object: impl MyTrait) -> bool {
    trait_object.foo(10)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_trait() {
        let spy = MyTraitSpy::default(); // build spy
        
        spy.foo.returns.set([true]); // set the return values

        assert!(use_trait(spy.clone())); // use the spy
        assert_eq!(vec![10], spy.foo.arguments.take()) // take the captured arguments
    }
}

For additional examples and features see the docs.

Acknowledgements

Autospy is heavily influenced by the excellent mockall crate, which, through automock, provides many similar features.

Autospy aims to offer these features through a macro-generated spy object, rather than a mock object. The use of either is largely personal preference; however, there are some advantages to using a spy object:

Test object Test failures Test structure Complexity
Mock Panics if expectations fail; error messages can be unclear Less standard pattern, expectations are baked into object More crate-specific syntax and usage patterns
Spy Asserts like any regular test Assert after use, more standard test pattern Simple: set what's returned, then inspect what was called
Commit count: 251

cargo fmt