Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does Chai JS make function parentheses optional?

I'm referring to the testing assertion library : http://chaijs.com/api/bdd/#false

You can write language chain assertions like the following:

expect(false).to.be.false;

expect() is obviously a global function, "to.be" looks like two properties, but how does the last part "false" work. I'm expecting that it would have to be a function call:

expect(false).to.be.false();

Is this 2015 ES syntax? I can't seem to find a reference to it in https://github.com/lukehoban/es6features

Stack Overflow says its not possible: How to implement optional parentheses during function call? (function overloading)

Can anyone shed some light on how something like this is implemented ?

Source Code: https://github.com/chaijs/chai/blob/master/lib/chai/core/assertions.js#L281

like image 604
Mike R Avatar asked May 10 '16 21:05

Mike R


1 Answers

You can do this (and a lot of other stuff) with Object.defineProperty. Here's a basic example:

// our "constructor" takes some value we want to test
var Test = function (value) {
    // create our object
    var testObj = {};

    // give it a property called "false"
    Object.defineProperty(testObj, 'false', {
        // the "get" function decides what is returned
        // when the `false` property is retrieved
        get: function () {
            return !value;
        }
    });
    // return our object
    return testObj;
};

var f1 = Test(false);
console.log(f1.false); // true
var f2 = Test("other");
console.log(f2.false); // false

There's a lot more you can do with Object.defineProperty. You should check out the MDN docs for Object.defineProperty for detail.

like image 120
Andrew Burgess Avatar answered Oct 02 '22 20:10

Andrew Burgess