mirror of
https://codeberg.org/JasterV/test-context.git
synced 2026-04-26 18:10:06 +00:00
96 lines
2.4 KiB
Markdown
96 lines
2.4 KiB
Markdown
[](https://crates.io/crates/test-context)
|
|
[](https://docs.rs/test-context)
|
|

|
|
[](https://github.com/markhildreth/test-context/actions)
|
|
|
|
# test-context
|
|
|
|
A library for providing custom setup/teardown for Rust tests without needing a test harness.
|
|
|
|
```rust
|
|
use test_context::{test_context, TestContext};
|
|
|
|
struct MyContext {
|
|
value: String
|
|
}
|
|
|
|
impl TestContext for MyContext {
|
|
fn setup() -> MyContext {
|
|
MyContext { value: "Hello, World!".to_string() }
|
|
}
|
|
|
|
fn teardown(self) {
|
|
// Perform any teardown you wish.
|
|
}
|
|
}
|
|
|
|
#[test_context(MyContext)]
|
|
#[test]
|
|
fn test_works(ctx: &mut MyContext) {
|
|
assert_eq!(ctx.value, "Hello, World!");
|
|
}
|
|
```
|
|
|
|
Alternatively, you can use `async` functions in your test context by using the
|
|
`AsyncTestContext`.
|
|
|
|
```rust
|
|
use test_context::{test_context, AsyncTestContext};
|
|
|
|
struct MyAsyncContext {
|
|
value: String
|
|
}
|
|
|
|
impl AsyncTestContext for MyAsyncContext {
|
|
async fn setup() -> MyAsyncContext {
|
|
MyAsyncContext { value: "Hello, World!".to_string() }
|
|
}
|
|
|
|
async fn teardown(self) {
|
|
// Perform any teardown you wish.
|
|
}
|
|
}
|
|
|
|
#[test_context(MyAsyncContext)]
|
|
fn test_works(ctx: &mut MyAsyncContext) {
|
|
assert_eq!(ctx.value, "Hello, World!");
|
|
}
|
|
```
|
|
|
|
The `AsyncTestContext` works well with async test wrappers like
|
|
[`actix_rt::test`](https://docs.rs/actix-rt/1.1.1/actix_rt/attr.test.html) or
|
|
[`tokio::test`](https://docs.rs/tokio/1.0.2/tokio/attr.test.html).
|
|
|
|
```rust
|
|
#[test_context(MyAsyncContext)]
|
|
#[tokio::test]
|
|
async fn test_works(ctx: &mut MyAsyncContext) {
|
|
assert_eq!(ctx.value, "Hello, World!");
|
|
}
|
|
```
|
|
|
|
## Skipping the teardown execution
|
|
|
|
If what you need is to take full **ownership** of the context and don't care about the
|
|
teardown execution for a specific test, you can use the `skip_teardown` keyword on the macro
|
|
like this:
|
|
|
|
```rust
|
|
use test_context::{test_context, TestContext};
|
|
|
|
struct MyContext {}
|
|
|
|
impl TestContext for MyContext {
|
|
fn setup() -> MyContext {
|
|
MyContext {}
|
|
}
|
|
}
|
|
|
|
#[test_context(MyContext, skip_teardown)]
|
|
#[test]
|
|
fn test_without_teardown(ctx: MyContext) {
|
|
// Perform any operations that require full ownership of your context
|
|
}
|
|
```
|
|
|
|
License: MIT
|