and*_*oke 37 javascript mocha.js node.js npm requirejs
我试图了解如何开发独立的Javascript代码.我想编写带有测试和模块的Javscript代码,从命令行运行.所以,我已经安装node.js
,并npm
与库一起requirejs
,underscore
和mocha
.
我的目录结构如下所示:
> tree .
.
??? node_modules
??? src
? ??? utils.js
??? test
??? utils.js
Run Code Online (Sandbox Code Playgroud)
src/utils.js
我正在编写的小模块在哪里,使用以下代码:
> cat src/utils.js
define(['underscore'], function () {
"use strict";
if ('function' !== typeof Object.beget) {
Object.beget = function (o) {
var f = function () {
};
f.prototype = o;
return new f();
};
}
});
Run Code Online (Sandbox Code Playgroud)
并且test/utils.js
是测试:
> cat test/utils.js
var requirejs = require('requirejs');
requirejs.config({nodeRequire: require});
requirejs(['../src/utils'], function(utils) {
suite('utils', function() {
test('should always work', function() {
assert.equal(1, 1);
})
})
});
Run Code Online (Sandbox Code Playgroud)
然后我尝试从顶级目录运行(所以mocha
看到test
目录):
> mocha
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Calling node's require("../src/utils") failed with error: ReferenceError: define is not defined
at /.../node_modules/requirejs/bin/r.js:2276:27
at Function.execCb (/.../node_modules/requirejs/bin/r.js:1872:25)
at execManager (/.../node_modules/requirejs/bin/r.js:541:31)
...
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
谢谢...
[抱歉 - 暂时发布错误代码的结果; 现在修复]
PS我正在使用requirejs,因为我也希望稍后从浏览器运行此代码(或其中一些代码).
更新/解决方案
下面的答案中没有的东西是我需要mocha -u tdd
用于上面的测试风格.这是最终测试(也需要断言)及其用法:
> cat test/utils.js
var requirejs = require('requirejs');
requirejs.config({nodeRequire: require});
requirejs(['../src/utils', 'assert'], function(utils, assert) {
suite('utils', function() {
test('should always work', function() {
assert.equal(1, 1);
})
})
});
> mocha -u tdd
.
? 1 tests complete (1ms)
Run Code Online (Sandbox Code Playgroud)
小智 18
您的测试未运行的原因是因为src/utils.js
它不是有效的Node.js库.
根据RequireJS文档,为了与Node.js和CommonJS require标准共存,您需要在文件顶部添加一些样板,src/utils.js
以便define
加载RequireJS的函数.
但是,由于RequireJS被设计为能够要求"经典"的面向Web浏览器的源代码,我倾向于将我的Node.js库使用以下模式,我也想在浏览器中运行:
if(typeof require != 'undefined') {
// Require server-side-specific modules
}
// Insert code here
if(typeof module != 'undefined') {
module.exports = whateverImExporting;
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是不需要为其他Node.js用户提供额外的库,并且通常可以在客户端上使用RequireJS.
一旦在Node.js中运行代码,就可以开始测试了.我个人仍然更喜欢表达摩卡,尽管它是后继测试框架.
Mocha文档缺少如何设置这些东西的信息,由于它在引擎盖下执行的所有魔术操作,因此很难弄清楚。
我发现了使用require.js在Mocha中的Node下获取浏览器文件的关键:Mocha 必须使用以下命令将文件添加到其套件中addFile
:
mocha.addFile('lib/tests/Main_spec_node');
Run Code Online (Sandbox Code Playgroud)
其次,beforeEach
与可选回调一起使用以异步加载模块:
describe('Testing "Other"', function(done){
var Other;
beforeEach(function(done){
requirejs(['lib/Other'], function(_File){
Other = _File;
done(); // #1 Other Suite will run after this is called
});
});
describe('#1 Other Suite:', function(){
it('Other.test', function(){
chai.expect(Other.test).to.equal(true);
});
});
});
Run Code Online (Sandbox Code Playgroud)
我创建了一个引导程序来了解如何使其全部正常工作:https : //github.com/clubajax/mocha-bootstrap
归档时间: |
|
查看次数: |
49087 次 |
最近记录: |