Small, parallel and fast test framework with suppport for async/await, promises, callbacks, streams and observables. Targets and works at node.js v0.10 and above.
npm install mukla> Small, parallel and fast test framework with suppport for async/await, promises, callbacks, streams and observables. Targets and works at node.js v0.10 and above.
[![code climate][codeclimate-img]][codeclimate-url]
[![code style][standard-img]][standard-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]
[![paypal donate][paypalme-img]][paypalme-url]
node test.jstest() function_(TOC generated by verb using markdown-toc)_
```
$ npm install mukla --save
or install using yarn
``
$ yarn add mukla
`js
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
})
`js
var fs = require('fs')
var test = require('mukla')
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
})
test and outputs the name of the test. If only function is given and it is anonymous, the name of the test is anonymous, otherwise the name of the fn function.Params
*
name {String|Function}: the title of the test or fn
* [fn] {Function}: test function, wrapped in [always-done][]
* showStack {Boolean}: if boolean true, will print stack when has error Example
`js
var test = require('mukla')// failing regular callbacks test
test('title of test', function (done) {
test.strictEqual(1, 2)
done()
})
// passing test with anonymous title
test(function (done) {
test.strictEqual(222, 222)
done()
})
`Supports
> Handles completion and errors of async/await, synchronous and asynchronous (callback) functions, also tests that returns streams, promises, child process and observables.$3
`js
var test = require('mukla')test('passing modern test', async function () {
return await Promise.resolve('foobar')
})
`$3
#### Returning a resolved Promise
`js
var test = require('mukla')test('passing promise test', function () {
return Promise.resolve(12345)
})
`#### Returning a rejected Promise
`js
var test = require('mukla')test('failing test with promise', function () {
return Promise.reject(new Error('foo bar'))
})
`$3
> Using .subscribe method of the observable#### Empty observable
`js
var test = require('mukla')
var Observable = require('rx').Observabletest('passing test with empty observable', function () {
return Observable.empty()
})
`#### Successful test wtih observable
`js
var test = require('mukla')
var Observable = require('rx').ObservablealwaysDone(function () {
return Observable.return([1, 2, 3])
})
`#### Failing observable
`js
var test = require('mukla')
var Observable = require('rx').Observabletest(function () {
return Observable.throw(new Error('observable error'))
})
`$3
`js
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()
})
})
`$3
#### Passing sync test
`js
var fs = require('fs')
var test = require('mukla')test(function () {
var res = fs.readFileSync('./package.json')
test.strictEqual(typeof res, 'string')
})
`#### Failing test with title
`js
var test = require('mukla')test('some failing test', function () {
JSON.parse('{Sjkfsf:"dfgfg')
})
`$3
> Handles completion of tests using [on-stream-end][] and [stream-exhaust][], behind the scenes, using [always-done][]#### Passing test with unpiped streams
`js
var fs = require('fs')
var test = require('mukla')test(function () {
return fs.createReadStream('./package.json')
})
`#### Failing test unpiped streams
`js
var fs = require('fs')
var test = require('mukla')test('failing stream test', function () {
return fs.createReadStream('foo bar')
})
`#### Failing test with piped streams
`js
var fs = require('fs')
var test = require('mukla')
var through2 = require('through2')test(function () {
var read = fs.createReadStream('foo bar')
return read.pipe(through2())
})
`$3
> Basically, they are streams, so completion is handled using [on-stream-end][] which is drop-in replacement for [end-of-stream][]#### Successful exec
`js
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
})
`#### Failing exec
`js
var test = require('mukla')
var cp = require('child_process')test('should be failing exec test', function () {
return cp.exec('foo-bar-baz sasa')
})
`#### Failing spawn
`js
var test = require('mukla')
var cp = require('child_process')test('failing child process spawn test', function () {
return cp.spawn('foo-bar-baz', ['hello world'])
})
`$3
#### uncaught exceptions
`js
var test = require('mukla')test('should be failing test with ReferenceError', function () {
foo // ReferenceError
return 55
})
`#### if test throws
`js
var test = require('mukla')test('failing test with SyntaxError', function () {
JSON.parse('{"foo":')
})
`Related
- always-done: Handle completion and errors with elegance! Support for streams, callbacks, promises, child processes, async/await and sync functions. A drop-in replacement… more | homepage
- core-assert: Node.js assert as a standalone module | assert as a standalone module"" class="text-primary hover:underline" target="_blank" rel="noopener noreferrer">homepage
- each-promise: Iterate over promises, promise-returning or async/await functions in series or parallel. Support settle (fail-fast), concurrency (limiting) and hooks system (start… more | homepage, concurrency (limiting) and hooks system (start, beforeEach, afterEach, finish)")
- gruu: Modern, small and powerful testing with TAP output and support for async/await, promises, callbacks, streams and observables, built on [always-done][]. | homepage
- minibase-is-registered: Plugin for [minibase][] and [base][], that adds isRegistered method to your application to detect if plugin is already registered and… more | isRegistered method to your application to detect if plugin is already registered and returns true or false if named plugin is already registered on the instance."" class="text-primary hover:underline" target="_blank" rel="noopener noreferrer">homepage
- minibase: Minimalist alternative for Base. Build complex APIs with small units called plugins. Works well with most of the already existing… more | homepage
- try-catch-core: Low-level package to handle completion and errors of sync or asynchronous functions, using [once][] and [dezalgo][] libs. Useful for and… more | homepageContributing
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
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
1. Please DO NOT edit README.md, CHANGELOG.md and .verb.md files. See "Building docs" section.
2. Ensure anything is okey by installing the dependencies and run the tests. See "Running tests" section.
3. Always use
npm run commit to commit changes instead of git commit, because it is interactive and user-friendly. It uses [commitizen][] behind the scenes, which follows Conventional Changelog idealogy.
4. 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! :)
Building docs
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._
Running tests
Clone repository and run the following in that cloned directory`
$ npm install && npm test
``+ github/tunnckoCore
+ twitter/tunnckoCore
+ codementor/tunnckoCore
*
_This file was generated by verb-generate-readme, v0.4.3, on March 17, 2017._
_Project scaffolded using [charlike][] cli._
[always-done]: https://github.com/hybridables/always-done
[assertit]: https://github.com/tunnckoCore/assertit
[async-done]: https://github.com/gulpjs/async-done
[base]: https://github.com/node-base/base
[charlike]: https://github.com/tunnckocore/charlike
[clean-stacktrace]: https://github.com/tunnckocore/clean-stacktrace
[commitizen]: https://github.com/commitizen/cz-cli
[core-assert]: https://github.com/sindresorhus/core-assert
[dezalgo]: https://github.com/npm/dezalgo
[end-of-stream]: https://github.com/mafintosh/end-of-stream
[istanbul]: https://github.com/gotwarlost/istanbul
[minibase]: https://github.com/node-minibase/minibase
[mocha]: https://mochajs.org
[on-stream-end]: https://github.com/tunnckocore/on-stream-end
[once]: https://github.com/isaacs/once
[standard-version]: https://github.com/conventional-changelog/standard-version
[stream-exhaust]: https://github.com/chrisdickinson/stream-exhaust.git
[testit]: https://github.com/ForbesLindesay/testit
[verb-generate-readme]: https://github.com/verbose/verb-generate-readme
[verb]: https://github.com/verbose/verb
[license-url]: https://www.npmjs.com/package/mukla
[license-img]: https://img.shields.io/npm/l/mukla.svg
[downloads-url]: https://www.npmjs.com/package/mukla
[downloads-img]: https://img.shields.io/npm/dt/mukla.svg
[codeclimate-url]: https://codeclimate.com/github/tunnckoCore/mukla
[codeclimate-img]: https://img.shields.io/codeclimate/github/tunnckoCore/mukla.svg
[travis-url]: https://travis-ci.org/tunnckoCore/mukla
[travis-img]: https://img.shields.io/travis/tunnckoCore/mukla/master.svg?label=linux
[appveyor-url]: https://ci.appveyor.com/project/tunnckoCore/mukla
[appveyor-img]: https://img.shields.io/appveyor/ci/tunnckoCore/mukla/master.svg?label=windows
[coverage-url]: https://codecov.io/gh/tunnckoCore/mukla
[coverage-img]: https://img.shields.io/codecov/c/github/tunnckoCore/mukla/master.svg
[david-url]: https://david-dm.org/tunnckoCore/mukla
[david-img]: https://img.shields.io/david/tunnckoCore/mukla.svg
[standard-url]: https://github.com/feross/standard
[standard-img]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg
[paypalme-url]: https://www.paypal.me/tunnckoCore
[paypalme-img]: https://img.shields.io/badge/paypal-donate-brightgreen.svg
[stacktrace-metadata]: https://github.com/tunnckocore/stacktrace-metadata