m.test
Version:
m(icro)test is a lightweight test runner for node.js written in es6+
176 lines (131 loc) • 5.13 kB
Markdown
# m.test
[](https://travis-ci.org/ivoputzer/m.test) [](package.json) [](http://standardjs.com/) [](http://packagequality.com/#?package=m.test) [](https://nodejs.org/docs/v6.0.0/api) [](https://www.npmjs.com/package/m.test) [](https://spdx.org/licenses/MIT)
**[m(icro)](https://github.com/ivoputzer/m.cro#readme)[test](https://github.com/ivoputzer/m.test)** is a lightweight test runner for [node.js](https://nodejs.org/) written in es6+ (~4kb).
#### donations
thanks for your support! [gratipay](https://gratipay.com/m.test/)
#### install
install [m.test](https://github.com/ivoputzer/m.test) directly from [npm](https://www.npmjs.com) to project's [devDependencies](https://docs.npmjs.com/files/package.json#devdependencies).
```sh
npm install --save-dev m.test
```
#### usage
test files are run by simply passing them to [node](https://nodejs.org). for a given `test/index.js` run the following command to execute the suite:
```sh
node test
```
run the following one to enable [node's debugger](https://nodejs.org/api/debugger.html):
```sh
node debug test
```
#### cli
more utilities to run your suites are available through the cli. if no files are given they will be looked up from `./test` recursively.
```sh
m.test [options] [files]
```
when executing suites through the cli `m.test` will be assigned to `global.test` by design. the following line can be omitted:
```javascript
const {test} = require('m.test')
```
further instructions can be accessed via `--help` flag and [man-pages](https://github.com/ivoputzer/m.test/tree/master/man) by executing either `m.test --help` or `man m.test` within your shell.
---
#### basic usage
```javascript
const {ok} = require('assert')
test('it just works!', function () {
ok(true)
})
```
#### async usage
```javascript
const {ok} = require('assert')
test('it works async too!', function (done) {
setTimeout(function () {
ok(true)
done()
}, 0)
})
test('done takes a error argument!', function (done) {
setTimeout(function (err = null) {
done(err)
}, 0)
})
test('runner works with Promise', function (done) {
let promise = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(true)
}, 0)
})
promise.then(result => {
ok(result)
done()
})
})
```
#### context usage
```javascript
test('can be used as a context', function () {
test('works!', function (done) {
done(null)
})
test('works!', function (done) {
done(null)
})
})
```
#### alias usage
```javascript
const {test: context, test: describe, test: it} = require('m.test')
context('given some context', function () {
describe('your subject', function () {
it('just works!', (done) => done(null))
})
})
```
#### beforeEach afterEach usage
```javascript
test('description', function (done) {
done(null)
})
beforeEach(done => setup(done))
afterEach(done => teardown(done))
```
it is important to call `beforeEach` and `afterEach` wrap functions after `test` functions themselves. when using wraps within nested suites consider their contextual binding.
```javascript
test('description 1', function () {
test('description 1.1', Function.prototype)
test('description 1.2', Function.prototype)
beforeEach(done => setup(done))
afterEach(done => teardown(done))
})
test('description 2', function () {
test('description 2.1', Function.prototype)
test('description 2.2', Function.prototype)
})
```
_(in the example above hooks would be called for `1.1` e `1.2`)_
---
#### skip modifier
```javascript
test.skip('description', function () {
// this function will never be called
})
```
the [skip](#skip-modifier) modifier comes with an optional `doSkip=true` parameter that enables/disables the skip behavior according to the expression:
```javascript
test.skip('description', function () {
// this test will be skipped when NODE_ENV=CI
}, /CI/gi.test(process.env.NODE_ENV))
```
#### timeout modifier
```javascript
test.timeout('description', function () {
// this test will fail if it exceeds 200ms of execution
}, 200)
```
the [timeout](#timeout-modifier) modifier comes with an optional `doTimeout=true` parameter that enables/disables the timeout behavior according to the expression:
```javascript
test.timeout('description', function () {
// this test will have a timeout when NODE_ENV=CI
}, 200, /CI/g.test(process.env.NODE_ENV))
```
[view more](https://github.com/ivoputzer/m.test/tree/master/test)