Home

Awesome

rescript-vitest

npm npm downloads license

ReScript bindings to Vitest

Prerequisite

ReScript v10.1+ is required since v1.0.0. To use Js.Promise2 and async/await for tests.

ReScript v11.x with the uncurried mode is supported since v2.x (unreleased).

Config

Configure with plain vite.config.js.

You can use vite-plugin-rescript to build ReScript automatically before the test.

Usage

You can find examples on tests

Basic

open Vitest

describe("Hello, Vitest", () => {
  test("This is a test case", t => {
    // t is `expect` object for suite-wide assertions
    t->assertions(3)

    // Test using the `Expect` module
    t->expect(1 + 2)->Expect.toBe(3)

    // There are some nested modules for specific type
    t->expect([1, 2, 3])
    ->Expect.Array.toContain(2)

    t->expect("Hello, ReScript-Vitest!")
    ->Expect.String.toContain("ReScript")

  // You can specify timeout for a test suite
  }, ~timeout=2000)
})

In-source testing (experimental)

Vitest support in-source testing

// This if block can be removed from production code.
// You need to define `import.meta.vitest` to `undefined`
if Vitest.inSource {
  open Vitest.InSource

  test("In-source testing", t => {
    t->expect(1 + 2)->Expect.toBe(3)
  })
}

Migration from 1.x

You need to bind test context t explicitly.

If you're migrating from 1.x, there is a built-in context binding in Vitest.Bindings.BuiltIn.

open Vitest
+open Vitest.Bindings.BuiltIn

describe("Hello, Vitest", t => {
  test("This is a test case", t => {
-    t->assertions(3)
+    assertions(3)

-    t->expect(1 + 2)->Expect.toBe(3)
+    expect(1 + 2)->Expect.toBe(3)
  })
})

You can use simple flags for skip, concurrent, and only.

Skip.test("This will be skipped", t => {
  // ...
})

// Use simple flags instead.
test(~skip=true, "This will be skipped", t => {
  // ...
})

Module bindings will be deprecated and removed in next major (v3)

LICENCE

MIT