npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

mocha-doctest

v0.3.4

Published

Test your documentation

Downloads

70

Readme

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'