Crate test_context

source ·
Expand description

A library for providing custom setup/teardown for Rust tests without needing a test harness.

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.

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)]
#[test]
fn test_works(ctx: &mut MyAsyncContext) {
    assert_eq!(ctx.value, "Hello, World!");
}

The AsyncTestContext works well with async test wrappers like actix_rt::test or tokio::test.

 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)]
#[tokio::test]
async fn test_async_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:

 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
}

Re-exports§

Traits§

  • The trait to implement to get setup/teardown functionality for async tests.
  • The trait to implement to get setup/teardown functionality for tests.

Attribute Macros§

  • Macro to use on tests to add the setup/teardown functionality of your context.