refute

azu/refute というAssertionライブラリを書きました。

refuteというのはassertの逆、つまりassert.not*を行うAssertionのことです。 これはBuster.JSのAssertionライブラリであるbusterjs/refereeが由来のものです。

Installation

npm install --save-dev refute

Usage

refute は既存のassert(Node’s Assert)を受け取って動作するようになっています。

var assert = require("assert");
var refute = require("refute")(assert);

API

以下のようにassertと逆にfalseだったらパスするようなAPIが用意されてます 。

refute(false);
refute.equal = assert.notEqual.bind(assert);
refute.strictEqual = assert.notStrictEqual.bind(assert);
refute.deepEqual = assert.notDeepEqual.bind(assert);
refute.throws = assert.doesNotThrow.bind(assert);

初期化の方法からもわかるように、内部的にassertを使っていて判定を逆転させているだけです。

実行例

var assert = require("assert");
var refute = require("refute")(assert);
describe("refute-test", function () {
    it("refute", function () {
        refute(false);// not true is pass
    });
    it("refute.equal", function () {
        refute.equal("string", "non-string");// pass
    });
    it("refute.deepEqual", function () {
        var obj = {
            a: 1
        };
        var expected = {
            b: 1
        };
        refute.deepEqual(obj, expected);// pass
    });
    it("refute.throws", function () {
        refute.throws(function(){
            assert(true);
        });
    });
});

power-assertとの連携

refutepower-assertとも一緒に使うこともできます。

1: require("assert") require("power-assert") Henkou

- var assert = require("assert");
+ var assert = require("power-assert");

2: espowerの設定でoptions.patternsrefute.*メソッドをそれぞれ追加します

require('espower-loader')({

    // directory where match starts with
    cwd: process.cwd(),

    // glob pattern using minimatch module
    pattern: 'test/**/*.js',

    // options for espower module
    espowerOptions: {
        patterns: [
            "assert(value, [message])",
            "refute(value, [message])",
            "assert.ok(value, [message])",
            "assert.equal(actual, expected, [message])",
            "refute.equal(actual, expected, [message])",
            "assert.notEqual(actual, expected, [message])",
            "assert.strictEqual(actual, expected, [message])",
            "refute.strictEqual(actual, expected, [message])",
            "assert.notStrictEqual(actual, expected, [message])",
            "assert.deepEqual(actual, expected, [message])",
            "refute.deepEqual(actual, expected, [message])",
            "assert.notDeepEqual(actual, expected, [message])"
        ]
    }
});

詳しくは espower.config.jsmocha.opts を見るといいと思います。


おわりに

azu/refuteはコンセプトの証明的な感じなので、あんまり実用的ではないかもしれませんが、 assert.notと違いrefuteという否定版があるとテスト書くときに迷いが減るので自分はこの考え方が結構好きです。

assert.ok があるのに対して assert.ng がないので、assert(!bool)と書くのが何かいやなので、refute(bool)とかけたらいいなーと思って書きました。