Home

Awesome

Rescript-jest

ReScript bindings for Jest

npm Travis Coverage Issues Last Commit

NOTE: The NPM package has moved to @glennsl/rescript-jest. Remember to update both package.json AND bsconfig.json.

Status

Rescript-jest

To generate ES6 bindings for your project, update bsconfig.json

    "suffix": ".mjs",
  "package-specs": {
    "module": "ES6",
    "in-source": true
  },

Then add @babel/core, @babel/preset-env and babel-jest packages to your project. Also, add babel.config.js

module.exports = {
    presets: [
        ['@babel/preset-env', 
            {targets: {node: 'current'}}
        ]
    ],
    "plugins": []
}

Finally, add minimal jest.config.js

module.exports = {
  moduleFileExtensions: [
    "js",
    "mjs",
  ],
testMatch: [
    "**/__tests__/**/*_test.mjs",
    "**/__tests__/**/*_test.bs.js",
  ],
    transform: {
    "^.+\.m?js$": "babel-jest"
  },
    transformIgnorePatterns: [
    "node_modules/(?!(rescript)/)"
  ],    

Update testMatch, transform and transformIgnorePatterns settings depending on where your tests are stored, and other dependenies of your project that may need to be transformed to ES6 format.

Most of what's commonly used is very stable. But the more js-y parts should be considered experimental, such as mocking and some of the expects that don't transfer well, or just don't make sense for testing idiomatic Reason/OCaml code but could be useful for testing js interop.

Example

open Jest;

describe("Expect", () => {
  open Expect;

  test("toBe", () =>
    expect(1 + 2) -> toBe(3))
});

describe("Expect.Operators", () => {
    open Expect;
    open! Expect.Operators;

    test("==", () =>
      expect(1 + 2) === 3)
  }
);

See the tests for more examples.

Installation

npm install --save-dev @glennsl/rescript-jest

or

yarn install --save-dev @glennsl/rescript-jest

Then add @glennsl/rescript-jest to bs-dev-dependencies in your bsconfig.json:

{
  ...
  "bs-dev-dependencies": ["@glennsl/rescript-jest"]
}

Then add __tests__ to sources in your bsconfig.json:

"sources": [
  {
    "dir": "src"
  },
  {
    "dir": "__tests__",
    "type": "dev"
  }
]

Usage

Put tests in a __tests__ directory and use the suffix *test.res/ (Make sure to use valid module names. e.g. <name>_test.res is valid while <name>.test.res is not). When compiled they will be put in a __tests__ directory under lib, with a *test.bs.js suffix, ready to be picked up when you run jest. If you're not already familiar with Jest, see the Jest documentation.

One very important difference from Jest is that assertions are not imperative. That is, expect(1 + 2) -> toBe(3), for example, will not "execute" the assertion then and there. It will instead return an assertion value which must be returned from the test function. Only after the test function has completed will the returned assertion be checked. Any other assertions will be ignored, but unless you explicitly ignore them, it will produce compiler warnings about unused values. This means there can be at most one assertion per test. But it also means there must be at least one assertion per test. You can't forget an assertion in a branch, and think the test passes when in fact it doesn't even test anything. It will also force you to write simple tests that are easy to understand and refactor, and will give you more information about what's wrong when something does go wrong.

At first sight this may still seem very limiting, and if you write very imperative code it really is, but I'd argue the real problem then is the imperative code. There are however some workarounds that can alleviate this:

Documentation

For the moment, please refer to Jest.resi.

Extensions

Troubleshooting

If you encounter the error SyntaxError: Cannot use import statement outside a module, it may be that you are mixing es6 and commonjs modules in your project. For example, this can happen when you are building a React project since React builds are always in ES6. To fix this, please do the following:

  "package-specs": {
    "module": "es6",
  }
{
  "transform": {
    "^.+\\.jsx?$": "esbuild-jest"
  },
  "transformIgnorePatterns": ["<rootDir>/node_modules/(?!(rescript|@glennsl/rescript-jest)/)"]
}

This problem is also addressed in Issue #63.

Contribute

git clone https://github.com/glennsl/rescript-jest.git
cd rescript-jest
npm install

Then build and run tests with npm test, start watchers for rescriptand jest with npm run watch:rescript and npm run watch:jest respectively. Install screen to be able to use npm run watch:screen to run both watchers in a single terminal window.

Changes

0.11

0.10

0.9.2

0.9.1

0.9

0.8

0.7

0.6

0.5.1

0.5.0

0.4.9

0.4.8

0.4.7

0.4.6

0.4.5

0.4.3

0.4.0

0.3.1

0.3.0

0.2.0