{%= name %} {%= badge('npm') %} [![mit license][license-img]][license-url] {%= badge('downloads') %} [![npm total downloads][downloads-img]][downloads-url]
{%= description %}
[![code climate][codeclimate-img]][codeclimate-url] [![linux build][travis-img]][travis-url] [![windows build][appveyor-img]][appveyor-url] [![code coverage][coverage-img]][coverage-url] [![dependency status][david-img]][david-url]
- Extremely lightweight and fast
- Small to download and install
- No implicit globals,
- No CLI, use plain
node test.js
- Powered by [always-done][]
- And so supports async/await, promises, observables streams and callbacks
- Enforces writing atomic tests
- Simple test syntax - just a single
test()
function - Works seamlessly with [istanbul][] for code coverage
- Stops after first failing test (also known as "fail fast" or "bail")
- Built-in [core-assert][] assertion library
- Targets and works at node.js v0.10 and above
- No need for build/transpilation/compilation step
- Backward-compatible with [assertit][] and so [testit][]
- Easy to porting of [mocha][]-style tests
- Clean stack traces by default, using [stacktrace-metadata][]
- Custom reporters, one built-in
Install with npm
$ npm install {%= name %} --save
or install using yarn
$ yarn add {%= name %}
For more use-cases see the tests
import fs from 'fs'
import test from 'mukla'
test(done => {
test.deepEqual([1, 2], [1, 2]) // passing
done()
})
// or without `done`, returning Promise
// stream, observerable and so on
test(() => {
return fs.createReadStream('not exist') // failing test
})
var fs = require('fs')
var test = require('{%= name %}')
test(function (done) {
test.deepEqual([1, 2], [1, 2]) // passing
done()
})
// or without `done`, returning Promise
// stream, observerable and so on
test(function () {
return fs.createReadStream('not exists') // failing
})
{%= apidocs('index.js') %}
Handles completion and errors of async/await, synchronous and asynchronous (callback) functions, also tests that returns streams, promises, child process and observables.
var test = require('mukla')
test('passing modern test', async function () {
return await Promise.resolve('foobar')
})
var test = require('mukla')
test('passing promise test', function () {
return Promise.resolve(12345)
})
var test = require('mukla')
test('failing test with promise', function () {
return Promise.reject(new Error('foo bar'))
})
Using
.subscribe
method of the observable
var test = require('mukla')
var Observable = require('rx').Observable
test('passing test with empty observable', function () {
return Observable.empty()
})
var test = require('mukla')
var Observable = require('rx').Observable
alwaysDone(function () {
return Observable.return([1, 2, 3])
})
var test = require('mukla')
var Observable = require('rx').Observable
test(function () {
return Observable.throw(new Error('observable error'))
})
var test = require('mukla')
var fs = require('fs')
test('some callback test', function (done) {
fs.readFile('./package.json', 'utf8', function (err, res) {
test.strictEqual(err, null)
test.strictEqual(typeof res, 'string')
test.strictEqual(res.length > 0, true)
done()
})
})
var fs = require('fs')
var test = require('mukla')
test(function () {
var res = fs.readFileSync('./package.json')
test.strictEqual(typeof res, 'string')
})
var test = require('mukla')
test('some failing test', function () {
JSON.parse('{Sjkfsf:"dfgfg')
})
Handles completion of tests using [on-stream-end][] and [stream-exhaust][], behind the scenes, using [always-done][]
var fs = require('fs')
var test = require('mukla')
test(function () {
return fs.createReadStream('./package.json')
})
var fs = require('fs')
var test = require('mukla')
test('failing stream test', function () {
return fs.createReadStream('foo bar')
})
var fs = require('fs')
var test = require('mukla')
var through2 = require('through2')
test(function () {
var read = fs.createReadStream('foo bar')
return read.pipe(through2())
})
Basically, they are streams, so completion is handled using [on-stream-end][] which is drop-in replacement for [end-of-stream][]
var test = require('mukla')
var cp = require('child_process')
var isChildProcess = require('is-child-process')
test('returning child processes', function () {
var proc = cp.exec('echo hello world')
test.strictEqual(isChildProcess(proc), true)
return proc
})
var test = require('mukla')
var cp = require('child_process')
test('should be failing exec test', function () {
return cp.exec('foo-bar-baz sasa')
})
var test = require('mukla')
var cp = require('child_process')
test('failing child process spawn test', function () {
return cp.spawn('foo-bar-baz', ['hello world'])
})
var test = require('mukla')
test('should be failing test with ReferenceError', function () {
foo // ReferenceError
return 55
})
var test = require('mukla')
test('failing test with SyntaxError', function () {
JSON.parse('{"foo":')
})
{% if (verb.related && verb.related.list && verb.related.list.length) { %}
{%= related(verb.related.list, {words: 20}) %} {% } %}
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/{%= repository %}/issues/new).
Please read the contributing guidelines for advice on opening issues, pull requests, and coding standards.
If you need some help and can spent some cash, feel free to contact me at CodeMentor.io too.
In short: If you want to contribute to that project, please follow these things
- Please DO NOT edit README.md, CHANGELOG.md and .verb.md files. See "Building docs" section.
- Ensure anything is okey by installing the dependencies and run the tests. See "Running tests" section.
- Always use
npm run commit
to commit changes instead ofgit commit
, because it is interactive and user-friendly. It uses [commitizen][] behind the scenes, which follows Conventional Changelog idealogy. - Do NOT bump the version in package.json. For that we use
npm run release
, which is [standard-version][] and follows Conventional Changelog idealogy.
Thanks a lot! :)
Documentation and that readme is generated using [verb-generate-readme][], which is a [verb][] generator, so you need to install both of them and then run verb
command like that
$ npm install verbose/verb#dev verb-generate-readme --global && verb
Please don't edit the README directly. Any changes to the readme must be made in .verb.md.
Clone repository and run the following in that cloned directory
$ npm install && npm test
{%= includeEither('authors', 'author') %}
{%= copyright({ start: 2015, linkify: true, prefix: 'Copyright', symbol: '©' }) %} {%= licenseStatement %}
{%= include('footer') %}
Project scaffolded using [charlike][] cli.
{%= reflinks(verb.reflinks) %}
[license-url]: https://www.npmjs.com/package/{%= name %} [license-img]: https://img.shields.io/npm/l/{%= name %}.svg
[downloads-url]: https://www.npmjs.com/package/{%= name %} [downloads-img]: https://img.shields.io/npm/dt/{%= name %}.svg
[codeclimate-url]: https://codeclimate.com/github/{%= repository %} [codeclimate-img]: https://img.shields.io/codeclimate/github/{%= repository %}.svg
[travis-url]: https://travis-ci.org/{%= repository %} [travis-img]: https://img.shields.io/travis/{%= repository %}/master.svg?label=linux
[appveyor-url]: https://ci.appveyor.com/project/tunnckoCore/{%= name %} [appveyor-img]: https://img.shields.io/appveyor/ci/tunnckoCore/{%= name %}/master.svg?label=windows
[coverage-url]: https://codecov.io/gh/{%= repository %} [coverage-img]: https://img.shields.io/codecov/c/github/{%= repository %}/master.svg
[david-url]: https://david-dm.org/{%= repository %} [david-img]: https://img.shields.io/david/{%= repository %}.svg