Skip to content

lhalf/autospy

Repository files navigation

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!([10], spy.foo.arguments) // check 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

About

A test spy object library for Rust.

Topics

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •