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.
我很确定你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会执行它.但是,没有调用describe或it在测试文件的最高范围内.回调中有调用,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我没有使用过,但应该给类似的功能.
| 归档时间: |
|
| 查看次数: |
3804 次 |
| 最近记录: |