A test spy object library.
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.
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.
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 |