mocha-doctest
Test your documentation
Last updated 4 years ago by andreypopp .
MIT · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install mocha-doctest 
SYNC missed versions from official npm registry.

mocha-doctest

Travis build status

Test your documentation.

Snippets like this:

Ok, let's test addition:

```js+test
2 + 2
// => 4
```

are coverted into runnable Mocha test suites which can be tested with the following command:

% mocha --compilers md:mocha-doctest ./README.md

Installation & Usage

Install with:

% npm install mocha-doctest mocha

Run with:

% mocha --compilers md:mocha-doctest ./README.md

Assertions against text representation

Trailing comments which starts with => are treated as assertions against textual representation of an expression which goes before:

2 + 2
// => 4

Regular assertions

Also assert Node.js module is available so you can use it directly:

assert(2 + 2 === 4)

Assertions for errors

If trailing comment is detected and start with Error: (actually any error name which ends with Error suffix) line then it is treated as an assertion against an error being thrown:

let maybeFunction = undefined;

undefined()
// TypeError: undefined is not a function

null()
// TypeError: ...

Testing async code (with Promise based API)

There's a possibility to test async code based on Promise API:

function sleep(ms) {
  let promise = new Promise(resolve => setTimeout(resolve, ms));
  promise = promise.then(value => {
    value;
    // => undefined
    return value;
  });
  return promise;
}

await sleep(50).then(_ => 42);
// => 42

Using wildcard pattern

You can use ... specify a wildcards:

let a = [1, 2, Math.random(), 4];

a
// => [ 1, 2, ..., 4 ]

Babel

Project babel configuration will be used (either .babelrc or "babel" key in package.json) but currently at least es2015 preset must be used as mocha-doctest emits ES2015 code. That might change is the future.

Tests

Import required harness:

import {runTest} from 'mocha-doctest/lib/testutils'

Simple assertions:

let {passes, failures} = runTest(`
  1
  // => 1
`)

passes.length
// => 1

failures.length
// => 0

Assertions against an error:

let {passes, failures} = runTest(`
  undefined()
  // TypeError: undefined is not a function
`)

passes.length
// => 1

failures.length
// => 0

Simple assertion with failure:

let {passes, failures} = runTest(`
  2 + 2
  // => 5
`)

passes.length
// => 0

failures.length
// => 1

failures[0].err.expected
// => '5'
failures[0].err.actual
// => '4'

More complex assertions:

let {passes, failures} = runTest(`
  [1, 2, 3]
  // => [ 1, 2, 3 ]
`)

passes.length
// => 1

failures.length
// => 0

Assertions which use ... wildcard:

let {passes, failures} = runTest(`
  [1, Math.random(), 3]
  // => [ 1, ..., 3 ]
`)

passes.length
// => 1

failures.length
// => 0

Assertions against an error with ... wildcard:

let {passes, failures} = runTest(`
  undefined()
  // TypeError: ...
`)

passes.length
// => 1

failures.length
// => 0

Assertions which use ... wildcard (failure):

let {passes, failures} = runTest(`
  let array = [1, Math.random(), 3]

  array
  // => [ 1, ..., 4 ]
`)

passes.length
// => 0

failures.length
// => 1

failures[0].err.expected
// => '[ 1, ..., 4 ]'

Assertions which async code:

let {passes, failures} = runTest(`
  await 1
  // => 1

  await Promise.resolve(42)
  // => 42
`)

passes.length
// => 1

failures.length
// => 0

Assertions which async code (failures)

let {passes, failures} = runTest(`
  await Promise.resolve(42)
  // => 43
`)

passes.length
// => 0

failures.length
// => 1

failures[0].err.expected
// => '43'
failures[0].err.actual
// => '42'

Assertions within async callbacks:

let {passes, failures} = runTest(`
  await Promise.resolve(42).then(async value => {
    value;
    // => 42
    await Promise.resolve(43)
    // => 43
  })
`)

passes.length
// => 1

failures.length
// => 0

Assertions which async code errors:

let {passes, failures} = runTest(`
  await Promise.reject(new Error('oops'))
  // Error: oops
`)

passes.length
// => 1

failures.length
// => 0

Assertions which async code errors (failures):

let {passes, failures} = runTest(`
  await Promise.reject(new Error('oops'))
  // SomeError: nope
`)

passes.length
// => 0

failures.length
// => 1

failures[0].err.expected
// => 'SomeError: nope'
failures[0].err.actual
// => 'Error: oops'

Current Tags

  • 0.3.4                                ...           latest (4 years ago)

5 Versions

  • 0.3.4                                ...           4 years ago
  • 0.3.3                                ...           4 years ago
  • 0.3.2                                ...           4 years ago
  • 0.3.1                                ...           4 years ago
  • 0.3.0                                ...           4 years ago
Maintainers (1)
Downloads
Today 0
This Week 0
This Month 0
Last Day 0
Last Week 0
Last Month 3
Dependencies (12)
Dev Dependencies (7)
Dependents (0)
None

Copyright 2014 - 2016 © taobao.org |