1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
# mock_instant
## mock_instant
This crate allows you to test Instant/Duration code, deterministically **_per thread_**.
If cross-thread determinism is required, enable the `sync` feature:
```toml
mock_instant = { version = "0.3", features = ["sync"] }
```
It provides a replacement `std::time::Instant` and `std::time::SystemTime` that uses a deterministic thread-local 'clock'
You can swap out the `std::time::Instant` with this one by doing something similar to:
```rust
#[cfg(test)]
use mock_instant::Instant;
#[cfg(not(test))]
use std::time::Instant;
```
or for a `std::time::SystemTime`
```
#[cfg(test)]
use mock_instant::{SystemTime, SystemTimeError};
#[cfg(not(test))]
use std::time::{SystemTime, SystemTimeError};
```
## Example
```rust
use std::time::Duration;
let now = Instant::now();
MockClock::advance(Duration::from_secs(15));
MockClock::advance(Duration::from_secs(2));
// its been '17' seconds
assert_eq!(now.elapsed(), Duration::from_secs(17));
```
# Mocking a SystemTime
```
# use mock_instant::{MockClock, SystemTime};
use std::time::Duration;
let now = SystemTime::now();
MockClock::advance_system_time(Duration::from_secs(15));
MockClock::advance_system_time(Duration::from_secs(2));
// its been '17' seconds
assert_eq!(now.elapsed().unwrap(), Duration::from_secs(17));
```
# Caveats
If the `sync` feature is enabled then all tests using this crate will use a global singleton clock.
see <https://github.com/museun/mock_instant/issues/6>
License: 0BSD
|