npm + Mocha + RequireJS

Mr *_*kél 12 mocha.js node.js npm requirejs requirejs-optimizer

我有很多时间尝试使用Mocha和RequireJS设置node/npm.这就是我所做的.

我已经创建了一个测试/目录,具有以下结构:

testing/
   |
   +-- package.json
   |
   +-- README.md
   |
   +-- test/
         |
         +-- mocha.opts
         |
         +-- widgets/
                |
                +--mywidget/
                       |
                       +-- test.js
Run Code Online (Sandbox Code Playgroud)

以下是每个相关文件包含的内容:

的package.json:

{
    "name":"testing-project",
    "version":"2.5.0",
    "description":"Testing Project",
    "keywords":["test"],
    "engines": { "node": ">= 0.7.0 < 0.11.0" },
    "scripts" : {
        "test": "./node_modules/.bin/mocha"
    },
    "devDependencies": {
        "mocha": ">= 1.18.2",
        "requirejs": ">= 2.1.11",
        "should": ">= 3.2.0",
        "expect.js": ">= 0.3.1"
    }
}
Run Code Online (Sandbox Code Playgroud)

测试/ mocha.opts:

--require expect.js
--require should
--require requirejs
--require mocha
--reporter spec
--ui tdd
--recursive
--growl
Run Code Online (Sandbox Code Playgroud)

测试/部件/进myWidget/test.js

'use strict';
var requirejs = require('requirejs');
// Also tried with:  require('../../../r.js')  which I downloaded from RequireJS' site

requirejs.config({
    baseUrl: '../../../../',
    nodeRequire: require
});

console.log('before require');
requirejs(['mywidget/trunk/src/mywidgetfile.js'], function(myObj){
    console.log('after require');

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

    // Instead of the above "requirejs['mywidget..." line, I've also tried:
    // var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js');   AND:
    // var myObj = requirejs('../../../../mywidget/trunk/src/mywidgetfile.js');

    describe('My Widget', function(){
        describe('my-widget#getInfo', function(){

            it('should pass this test', function(done){
                expect( myObj.returnString('test') ).to.equal( 'test' );

                done();
            })
        })
    });
});
console.log('done');
Run Code Online (Sandbox Code Playgroud)

它会在"require"和"done"之前输出控制台行,但只要我有requirejs(['mywidget ... line in,它就不会点击after require.如果我删除了requirejs行(和相应的右括号/ paren line),而是使用直接"var myObj ="行,我得到"找不到模块",如果我使用第二个"var myObj"行,我得到"引用错误:定义未定义".

为了方便其他开发人员,我试图打包这一切,使用npm,这样我就可以从顶部的"testing /"目录中运行命令"npm test".

我一直在寻找答案并尝试了很多东西,但我似乎不需要使用RequireJS的文件并定义了"define()".我可以执行测试,这不是问题...它只是试图将RequireJS插入到我开始遇到问题的混合中.

任何帮助都将是巨大的!

谢谢!

Lou*_*uis 11

您向我们展示的内容中存在多个问题.你错误地使用RequireJS和Mocha.

RequireJS

我很确定你baseUrl的错误.您似乎认为Mocha的当前工作目录将在test/widgets/mywidget/执行测试时设置为test/widgets/mywidget/test.js.事实并非如此.工作目录就在您运行时的任何位置npm test.根据你的描述,你在testing/运行时就在.我不清楚你baseUrl应该有什么价值,因为你没有在你的问题中提供足够的信息,但我相信我刚才给你的解释可以弄明白.

现在你可能会认为"我的确baseUrl是正确的,因为当我执行时requirejs(['mywidget/trunk/src/mywidgetfile.js'], function(myObj){我没有得到错误".这将是一个不正确的推断.虽然此requirejs调用计划加载模块,但RequireJS没有机会尝试加载它,因为Mocha在RequireJS尝试加载之前退出.您可以通过用完全垃圾替换模块路径来检查这一点,您将不会收到错误.

解决此baseUrl问题后,使用var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js')将按预期工作.因此,您将能够避免使用异步形式require(这是使用依赖关系数组作为第一个参数的形式).(requirejs您使用的函数只是requireRequireJS文档中通常调用的函数的别名.)

摩卡

您的测试未运行,因为Mocha没有看到它们.Mocha的工作方式是读取它找到的所有测试文件,然后执行它们.每次describe调用的回调都会立即执行,每次it调用的回调都会记录为要运行的测试.一旦Mocha完成了确定存在哪些测试,它就会运行它们.

你的测试文件会发生什么,就像往常一样,Mocha会执行它.但是,没有调用describeit在测试文件的最高范围内.回调中有调用,requirejs但记住我上面所说的内容:RequireJS没有机会加载模块,因此它没有机会运行回调.(即使它确实运行了,也为时已晚.)因此,Mocha没有立即看到任何测试和退出.

未来之路

找出baseUrl你需要的,然后这应该工作:

'use strict';
var requirejs = require('requirejs');

requirejs.config({
    baseUrl: <whatever value is needed here>,
    nodeRequire: require
});

var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js');

describe('My Widget', function() {
// etc...
Run Code Online (Sandbox Code Playgroud)

您也可以考虑从您的测试套件中完全删除RequireJS.我编写了一个在Node中和浏览器一样工作的库.它由AMD模块组成,并在浏览器中由RequireJS加载,但我不在测试套件中使用RequireJS.这是我用来在Node中加载模块的加载器.还有amdefine我没有使用过,但应该给类似的功能.