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 。