Create immutable test state before each test case.


Keywords
ava, babel, coverage, easy, expect, instant, immutable, inference, jasmine, jest, mocha, testing, test, typescript
License
MIT
Install
npm install teststate@0.0.4

Documentation

teststate

Create immutable test state reinitialized after each test case with type inference.

Install

Using npm

npm install teststate

Using yarn

yarn add --dev teststate

How to use this library?

Use testState method when your test state is built from some complex types / factory methods.

// (1) import testState method from teststate module.
import { testState } from "teststate";

const EXPECTED_VALUE = "...";

describe("test fooMethod", () =>
  // (2) Declare state, pass a callback that builds state to be recreated between each tests.
  const state = testState(() => {
    const foo = fooFactory();
    return { foo };
  }, beforeEach);

  it("returns bar", () => {
    // (3) Use state inside test methods.
    const result = fooMethod(state.foo);

    expect(result).toBe(EXPECTED_VALUE);
  });
});

Use resetState method when your test state consist only primitive types and can be serialized.

// (1) import resetState method from teststate module.
import { resetState } from "teststate";

const EXPECTED_VALUE = "...";

describe("test fooMethod", () =>
  // (2) Declare state.
  const state = {
    foo: 1,
  }

  // (3) Call `resetState` in `beforeEach` method.
  beforeEach(() => resetState(state));

  it("returns bar", () => {
    // (4) Use state inside test methods.
    const result = fooMethod(state.foo);

    expect(result).toBe(EXPECTED_VALUE);
  });
});

Why should I use this library?

Normally, when you define some state in beforeEach hook, you do:

describe("tests", () => {
  let foo: null | SomeType = null;

  beforeEach(() => {
    foo = createSomeTypeInstance();
  });

  it("passes the test", () => {
    // here foo can be SomeType | null
  });
});
describe("tests", () => {
  const state = testState(() => {
    return {
      foo: createSomeTypeInstance(),
    };
  }, beforeEach);

  it("passes the test", () => {
    // here state.foo must be SomeType
  });
});

With teststate, foo is always of type SomeType and can be accessed via state.foo.