# Double
### Full-featured mocking library in Rust, including rich failure messages and argument matchers.
[![Build Status](https://travis-ci.org/DonaldWhyte/double.svg?branch=master)](https://travis-ci.org/DonaldWhyte/double) [![Docs](https://docs.rs/double/badge.svg)](https://docs.rs/double)
Based off [**iredelmeier's**](https://github.com/iredelmeier/) initial mock implementation.
Double lets you mock `Trait` implementations so that you can track function call arguments and set return values or overrides functions at test time.
Here's a quick example:
```rust
#[macro_use]
extern crate double;
// Code under test
trait BalanceSheet {
fn profit(&self, revenue: u32, costs: u32) -> i32;
}
fn get_profit(revenue: u32, costs: u32, balance_sheet: &BalanceSheet) -> i32 {
balance_sheet.profit(revenue, costs)
}
// Tests which uses a mock BalanceSheet
mock_trait!(
MockBalanceSheet,
profit(u32, u32) -> i32);
impl BalanceSheet for MockBalanceSheet {
mock_method!(profit(&self, revenue: u32, costs: u32) -> i32);
}
fn test_weighting_is_applied() {
// GIVEN:
let sheet = MockBalanceSheet::default();
sheet.profit.return_value(250);
// WHEN:
let profit = get_profit(500, 250, &sheet);
// THEN:
assert_eq!(250, profit);
}
fn test_correct_args_passed_to_balance_sheet() {
// GIVEN:
let sheet = MockBalanceSheet::default();
// WHEN:
let _ = get_profit(500, 250, &sheet);
// THEN:
sheet.profit.has_calls_exactly_in_order(vec!((500, 250)));
}
// Executing tests
fn main() {
test_weighting_is_applied();
test_correct_args_passed_to_balance_sheet();
}
```
More examples are available in the [examples directory](./examples).
### Credits
This library is based off [**iredelmeier's**](https://github.com/iredelmeier/) initial mocking implementation. Massive thanks to her implementation for inpsiring me to work on this. The repo for her library [**can be found here**](https://github.com/iredelmeier/pseudo).
If you're interested in testing, check out her other repositories too!