You can use all tools of the JS ecosystem.

Several js libs already have a Fable binding:

Example with jest


You should install js test runner :

  npm install jest --save-dev

And Fable binding :

  # nuget
  dotnet add package Fable.Jester
  # paket
  paket add Fable.Jester --project ./project/path

Write tests

Now, you can write your first test :

open Fable.Jester

Jest.describe("can run basic tests", fun () ->
    Jest.test("running a test", fun () ->

See Jester documentation to more informations :


Before running the tests, you have to convert your project to JS, but you don't need to bundle with Webpack, because test runners generally prefer to have small files rather than a single big file. So we only need to run the Fable compiler and put the generated code in an output dir.

  dotnet fable src -o output

You should config Jest with a config file jest.config.js :

module.exports = {
  moduleFileExtensions: ['js'],
  roots: ['./output'],
  testMatch: ['<rootDir>/**/*.Test.js'],
  coveragePathIgnorePatterns: ['/\.fable/', '/[fF]able.*/', '/node_modules/'],
  testEnvironment: 'node',
  transform: {}

roots should be equal to the outDir of the compiler. testMatch indicate file pattern name with test. coveragePathIgnorePatterns, testEnvironment, transform improve performance of runner. You can read Jest doc to see more :

Now, you can run then tests:

  npx jest --config=jest.config.js

Youhou! You can see the test result :)

You can specify this command on npm in package.json :

  "scripts": {
    "test": "dotnet fable src -o output --run jest --config=jest.config.js",

And now run with a single command:

  npm test

Watch mode

Running tests each time is slow. You can use the watch feature to take advantage of the compiler and runner cache, and run tests whenever a file changes.

Currently, Fable doesn't have official plugins for the different runners. So you have to execute these two commands in parallel:

  dotnet fable watch src -o output
  npx jest --config=jest.config.js --watchAll

You add an npm script in package.json :

  "scripts": {
    "test": "dotnet fable src -o output && jest --config=jest.config.js",
    "watch-test:build": "dotnet fable watch src -o output",
    "watch-test:run": "jest --config=jest.config.js --watchAll",
    "watch-test": "npm-run-all --parallel watch-test:*"

I use npm-run-all to run several commands in parallel. You should install with:

  npm install --save-dev npm-run-all

Now, run

  npm run-script watch-test

Enjoy :)