Helper JavaScript library for promises testing.
Switch branches/tags
Clone or download
Latest commit ef4a1a1 Apr 4, 2017

README.md

promise-test-helper Build Status

promise-test-helper is library for promise testing.

This library help you avoid promise traps on testing.

Trap case:

You expected to mayBeRejected() is rejected, but it is resolved.

The result was always passed. (Unexpected!)

function mayBeRejected(){
    return Promise.resolve();
}
it("is bad pattern", function () {
    return mayBeRejected().catch(function (error) {
        assert(error instanceof Error);
    });
});

You can write intended test with promise-test-helper.

The result was Fail. Yes go as expected!

var shouldRejected = require("promise-test-helper").shouldRejected;
function mayBeRejected(){
    return Promise.resolve();
}
it("should be failed", function () {
    return shouldRejected(mayBeRejected()).catch(function (error) {
        assert(error instanceof Error);
    });
});

Installation

npm install --save-dev promise-test-helper

I'd recommend use with Mocha or Buster.JS - support promise testing.

Usage

This library provide two methods.

var shouldFulfilled = require("promise-test-helper").shouldFulfilled;
var shouldRejected = require("promise-test-helper").shouldRejected;
// in test code
shouldFulfilled(aPromise).then(function(){ /* assert */ });
shouldRejected(aPromise).catch(function(){ /* assert */ });

Example :

"use strict";
var assert = require("assert");
var Promise = require("ypromise");
var shouldFulfilled = require("../lib/promise-test-helper").shouldFulfilled;
var shouldRejected = require("../lib/promise-test-helper").shouldRejected;
describe("promise-test-helper", function () {
    beforeEach(function () {
        this.fulfilledPromise = Promise.resolve("value");
        this.rejectedPromise = Promise.reject(new Error("error"));
    });
    describe("Passing good test", function () {
        context("when promise is fulfilled", function () {
            it("should be passed", function () {
                return shouldFulfilled(this.fulfilledPromise).then(function (value) {
                    assert(value === "value");
                })
            });
        });
        context("when promise is rejected", function () {
            it("should be passed", function () {
                return shouldRejected(this.rejectedPromise).catch(function (error) {
                    assert(error instanceof Error);
                });
            });
        });
    });
});

You can avoid following wrong test by using these method :

(following tests are failed.)

// == Bad test pattern
describe("Detect bad test pattern", function () {
    context("when argument is not promise", function () {
        it("should be failed", function () {
            return shouldFulfilled("string");// is not a promise object
        });
    });
    context("when promise is rejected", function () {
        it("should be failed", function () {
            return shouldFulfilled(this.rejectedPromise).catch(function (error) {
                assert(error);// expect to fulfilled?
            });
        });
    });
    context("when argument is not promise", function () {
        it("should be failed", function () {
            return shouldRejected("string");// is not a promise object
        });
    });
    context("when promise is fulfilled", function () {
        it("should be failed", function () {
            return shouldRejected(this.fulfilledPromise).then(function (value) {
                assert(value);// expect to rejected?
            });
        });
    });
});

This library inspired by domenic/chai-as-promised.

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

License

MIT