Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Jasmine spyOn to mock function in Browserify module

I'm trying to run a unit test on a function (testFunc). testFunc calls another function (secondFunc) which I would like to mock. Can I mock secondFunc so that when it is called in the context of testFunc, the spiedOn version of secondFunc is called? If not, how should I reformat my browserify module to make it testable?

Currently the setup looks something like this:

app.js (Browserify Module)

module.exports = (function () {
    function testFunc() {
        secondFunc();
    }

    function secondFunc(){
        console.log('not mocked!');
    }

    return {
        testFunc, secondFunc
    };

})();

test.js (Jasmine Test)

describe("testFunc", () => {
    let app = require('./app');

    beforeEach(() => {
        spyOn(app, 'secondFunc');
    });

    it("should call secondFunc spy", () => {
        app.testFunc();
        expect(app.secondFunc).toHaveBeenCalled();
    });

});
like image 923
dfat Avatar asked Nov 25 '25 02:11

dfat


1 Answers

The way you have it now, the spyOn is replacing the secondFunc property on your returned object with a proxy, but your code calls the secondFunc function that is inside the closure of the anonymous function. There are several ways to restructure your code to better expose the functions.

You could structure your module this way:

exports.testFunc = function() {
    exports.secondFunc();
}

exports.secondFunc = function(){
    console.log('not mocked!');
}

which is a lot smaller, easier to read, and let you mock the secondFunc function.

like image 200
CodingWithSpike Avatar answered Nov 27 '25 10:11

CodingWithSpike



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!