Expand description
This project is inspired by Nimble for Swift. It provides matchers and matcher functions to express expectations in tests for common cases, such as: Equality, Order, Option, Result, etc. The crate also provides instruments to implement custom matchers for your project’s domain.
You express expectations in your tests using three basic constructs:
expect!(...).to(...);
expect!(...).to_not(...);
expect!(...).not_to(...);If a test fails, you will see the reason in a nice, human readable format.
§Example
let result = vec![1, 2, 2];
expect!(result).to(be_equal_to([1, 2, 3]));
// --
// This will print:
// expected to be equal to <[1, 2, 3]>, got <[1, 2, 2]>§Structure
The crate consists of two modules core and matchers but for general use
you can access all you need using prelude module. The expect! macro saves
file name and line number to print it later if an expectation fails. Internally the macro uses
the expect function which is also available to you.
§Usage
The crate is meant to be used in tests, so we recommend you include it as a dev dependency
with #[cfg(test)] attribute.
In your Cargo.toml:
[dev-dependencies]
expectest = "0.10.0"If you prefer nightly rust and want failure messages to be integrated in rust’s
standard panic message, enable nightly feature:
[dev-dependencies]
expectest = { version = "0.10.0", features = ["nightly"] }In your tests:
use expectest::prelude::*;§Matchers
Keep in mind that some matchers work with types that implement Debug trait
to print inner representation. You need to implement or derive it for your types.
§Equality
For types that implement PartialEq trait you can use be_equal_to function or its alias
be_eq.
expect!("hello".to_string()).to(be_equal_to("hello"));§Equality of Floats
With default delta equal to 0.001.
expect!(12.001_f64).to(be_close_to(12.0));
expect!(12.1_f64).to(be_close_to(12.0).delta(0.1));§Order
For types that implement PartialOrd trait you can use any of the following matchers:
be_less_thanbe_less_or_equal_tobe_greater_thanbe_greater_or_equal_to
or their aliases respectively:
be_ltbe_lebe_gtbe_ge
expect!(1).to(be_greater_than(0));§Ranges
For two-sided checks range matcher can be used:
be_within_range
expect!(1).to(be_within_range(0..=1));§Option<T>
Use be_some or be_none matchers.
expect!(Some(9)).to(be_some());
expect!(Some(9)).to(be_some().value(9));§Result<T, E>
Use be_ok or be_err matchers.
expect!("4".parse::<u32>()).to(be_ok());
expect!("4".parse::<u32>()).to(be_ok().value(4));§Iterators
For types that implement Iterator + Clone trait.
Use be_empty or have_count matchers.
expect!("".chars()).to(be_empty());
expect!("abc".chars()).to(have_count(3));§Boolean
Use be_true or be_false matchers.
expect!(9 == 9).to(be_true());That’s all you need to know.
Happy Testing 😊
Modules§
- core
- A module contains core types of this library.
- matchers
- A module contains matchers.
- prelude
- A module contains reexport of all useful functions.
Macros§
- expect
- A macro intended to use as a powerful replacement of
expectfunction.