JavaScript test (mocha) with 'import' js file

javascript, mocha.js, node.js, require, unit-testing

Solution

UPDATE: FINAL ANSWER:

My previous answer is invalid since `eval(code);` is not useful for variables.

Fortunately, `node` has a strong method - `vm`

http://nodejs.org/api/vm.html

However, according to the doc,

The vm module has many known issues and edge cases. If you run into issues or unexpected behavior, please consult the open issues on GitHub. Some of the biggest problems are described below.

so, although this works on the surface, extra care needed for such an purpose like testing...

var expect = require('chai')
    .expect;

var fs = require('fs');
var vm = require('vm');
var path = './app.js';

var code = fs.readFileSync(path);
vm.runInThisContext(code);

describe('SpaceTime', function()
{
    describe('brabra', function()
    {
        it('MEMORY === "MEMORY"',
            function()
            {
                expect(MEMORY)
                    .to.equal('MEMORY');
            })
    });

});

AFTER ALL; The best way I found in this case is to write the test mocha code in the same file.

Problem

I understand `module.export` and `require` mannner: Requiring external js file for mocha testing Although it's pretty usable as long as it's a module, I feel this manner is inconvenient since what I intends to do now is to test a code in a file. For instance, I have a code in a file: app.js ``` 'use strict'; console.log('app.js is running'); var INFINITY = 'INFINITY'; ``` and now, I want to test this code in a file: test.js ``` var expect = require('chai').expect; require('./app.js'); describe('INFINITY', function() { it('INFINITY === "INFINITY"', function() { expect(INFINITY) .to.equal('INFINITY'); }); }); ``` The test code executes `app.js`, so the output is; `app.js is running` then `ReferenceError: INFINITY is not defined` This is not what I expected. I do not want to use `module.export` and to write like `var app = require('./app.js');` and `app.INFINITY` and `app.anyOtherValue` for every line in the test code. There must be a smart way. Could you tell me? Thanks.

Original source

Related problems