npm +摩卡+ RequireJS

我有相当多的时间尝试与Mocha和RequireJSbuild立node / npm。 这是我所做的。

我创build了一个testing/目录,结构如下:

testing/ | +-- package.json | +-- README.md | +-- test/ | +-- mocha.opts | +-- widgets/ | +--mywidget/ | +-- test.js 

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

的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" } } 

testing/ mocha.opts:

 --require expect.js --require should --require requirejs --require mocha --reporter spec --ui tdd --recursive --growl 

testing/部件/进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'); 

它会输出控制台线“之前要求”和“完成”,但只要我有requirejs(['mywidget …线,它不会击中后要求。如果我删除了requirejs行(和相应的右括号/ paren线),而是使用直接的“var myObj =”行,我得到“无法find模块”,如果我使用第二个“var myObj”行,我得到“参考错误:定义没有定义”。

为了便于其他开发人员使用npm,我试图将其全部打包,以便在顶部的“testing /”目录中运行命令“npm test”。

我一直在寻找答案,并尝试这么多的东西,但似乎无法使用RequireJS需要一个文件,并定义了“define()”。 我可以执行testing,这不是一个问题…它只是试图插入RequireJS到混合,当我开始有问题。

任何帮助将是巨大的!

谢谢!

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

RequireJS

我很确定你的baseUrl是不正确的。 你似乎认为Mocha当前的工作目录将被设置为test/widgets/mywidget/当它执行test/widgets/mywidget/test.js中的test/widgets/mywidget/test.js 。 事实并非如此。 当你运行npm test时,工作目录是你碰巧遇到的地方。 根据你的描述你正在testing/当你运行它。 我不清楚你的baseUrl应该是什么样的价值,因为你没有提供足够的信息,但我相信从我给你的解释可以看出来。

现在你可能会想“当然,我的baseUrl是正确的,因为当我执行requirejs(['mywidget/trunk/src/mywidgetfile.js'], function(myObj){我没有得到一个错误”。这将是一个不正确的推理当这个requirejs调用调度你的模块的加载时,RequireJS没有机会尝试加载它,因为Mocha在RequireJS尝试加载之前就退出了,你可以通过用完全的垃圾代替你的模块path来检查,得到一个错误。

一旦你解决了这个baseUrl问题,使用var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js')将会像你期望的那样工作。 所以你可以避免使用asynchronousforms的require (这是使用一个依赖数组作为第一个参数的forms)。 (您使用的requirejs函数只是RequireJS文档中通常称为require的函数的别名。)

摩卡

您的testing没有运行,因为摩卡没有看到它们。 摩卡的工作方式是读取所有find的testing文件,然后执行它们。 每个describe调用的callback都被立即执行,并且每个调用的callback被logging为要运行的testing。 一旦摩卡搞定了什么testing存在,它运行它们。

你的testing文件会发生什么事情,就像往常一样,Mocha执行它。 但是,没有要求在testing文件的顶部范围内describe it 。 在callbackrequirejs有一些调用,但是请记住我上面所说的:RequireJS没有机会加载模块,所以没有机会运行callback。 (即使它运行了,也为时已晚)所以摩卡没有看到任何testing,马上就退出了。

前进的道路

找出你需要的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... 

您也可以考虑完全从您的testing套件中删除RequireJS。 我编写了一个在Node中和在浏览器中一样的库。 它由AMD模块组成,在浏览器中由RequireJS加载,但是我没有在testing套件中使用RequireJS。 这是我用来在Node中加载我的模块的加载器 。 也有我没有使用,但应该给予类似的能力amdefine 。