How to properly require modules from mocha.opts file

不羁的心 提交于 2019-12-03 07:36:58

问题


I'm using the expect.js library with my mocha unit tests. Currently, I'm requiring the library on the first line of each file, like this:

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

describe('something', function () {
    it('should pass', function () {
        expect(true).to.be(true); // works
    });
});

If possible, I'd like to remove the boilerplate require code from the first line of each file, and have my unit tests magically know about expect. I thought I might be able to do this using the mocha.opts file:

--require ./node_modules/expect.js/index.js

But now I get the following error when running my test:

ReferenceError: expect is not defined

This seems to make sense - how can it know that the reference to expect in my tests refers to what is exported by the expect.js library?

The expect library is definitely getting loaded, as if I change the path to something non-existent then mocha says:

"Error: Cannot find module './does-not-exist.js'"

Is there any way to accomplish what I want? I'm running my tests from a gulp task if perhaps that could help.


回答1:


You are requiring the module properly but as you figured out, the symbols that the module export won't automatically find themselves into the global space. You can remedy this with your own helper module.

Create test/helper.js:

var expect = require("expect.js")

global.expect = expect;

and set your test/mocha.opts to:

--require test/helper



回答2:


While Louis's answer is spot on, in the end I solved this with a different approach by using karma and the karma-chai plugin:

Install:

npm install karma-chai --save-dev

Configure:

karma.set({

    frameworks: ['mocha', 'chai']
    // ... 
});

Use:

describe('something', function () {
    it('should pass', function () {
        expect(true).to.be(true); // works
    });
});



回答3:


Thanks to Louis answer and a bit of fiddling around I sorted out my test environment references using mocha.opts. Here is the complete setup.

My project is a legacy JavaScript application with a lot of "plain" js files which I wish to reference both in an html file using script tags and using require for unit testing with mocha.

I am not certain that this is good practice but I am used to Mocha for unit testing in node project and was eager to use the same tool with minimal adaptation.

I found that exporting is easy:

class Foo{...}
class Bar{...}
if (typeof module !== 'undefined') module.exports = { Foo, Bar };

or

class Buzz{...}
if (typeof module !== 'undefined') module.exports = Buzz;

However, trying to use require in all the files was an issue as the browser would complain about variables being already declared even when enclosed in an if block such as:

if (typeof require !== 'undefined') {
    var {Foo,Bar} = require('./foobar.js');    
}

So I got rid of the require part in the files and set up a mocha.opts file in my test folder with this content. The paths are relative to the root folder:

--require test/mocha.opts.js

mocha.opts.js content. The paths are relative to the location of the file:

global.assert = require('assert');
global.Foo = require("../foobar.js").Foo;
global.Bar = require("../foobar.js").Bar;
global.Buzz = require("../buzz.js");


来源:https://stackoverflow.com/questions/31282839/how-to-properly-require-modules-from-mocha-opts-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!