Search code examples
javascriptnode.jsunit-testing

Testing JavaScript Written for the Browser in Node JS


I have some JavaScript that is going to run in the browser, but I have broken the logic based functions that have nothing to do with the DOM into their own js files.

If it's possible, I would prefer to test these files via command line, why have to open a browser just to test code logic? After digging through multiple testing libraries for Node.js. I suppose it's not a big deal, but that seems to require that I build a whole node project, which requires that I provide a main, which doesn't really exist in my project since it's just functions that get fired from a web page.

Is there a solution for testing JavaScript functions that can be as simple as just writing a .js file with tests in it and calling a utility to run those tests? Something more simple than having to set up a runner, or build a project and manage dependencies? Something that feels like writing and running JUnit Tests in Eclipse, and a little less like having to set up a Maven project just to run MVN test?

As a follow-up question, is this even the right way to go about it? Is it normal to be running tests for JavaScript that is meant to run in the browser in Node.js?


Solution

  • Use test runners like mocha or jasmine. Very easy to setup and start writing test code. In mocha for example, you can write simple test cases like

    var assert = require('assert');
    var helper = require('../src/scripts/modules/helper.js');
    var model = require('../src/scripts/modules/model.js');
    
    model.first.setMenuItem ({
      'title': 'Veggie Burger',
      'count': 257,
      'id': 1
    });
    
    describe('increment', function(){
      console.log ("Count : " + model.first.getMenuItem().count);
    
      it('should increment the menu item', function(){
        helper.increment();
        assert.equal(model.first.getMenuItem().count, 258);
      });
    
    });
    

    and run them like

    $ ./node_modules/mocha/bin/mocha test/*.js
    

    where test/*.js are the specifications file (unit test file like the one above)

    the output will be something like:

    Count : 257
    
    
      increment
        ✓ should increment the menu item
    
    
      1 passing (5ms)
    

    You can even use headless browser like PhantomJS to test containing DOM manipulation code.