我试图了解如何开发独立的Javascript代码。我想用命令行运行测试和模块编写Javscript代码。所以,我已经安装node.js,并npm伴随着图书馆requirejs,underscore和mocha。
node.js
npm
requirejs
underscore
mocha
我的目录结构如下所示:
> tree . . ├── node_modules ├── src │ └── utils.js └── test └── utils.js
src/utils.js我在用下面的代码编写的一个小模块在哪里:
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(); }; } });
并且test/utils.js是测试:
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); }) }) });
然后,我尝试从顶级目录运行(因此mocha看到该test目录):
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) ...
所以我的问题是:
谢谢…
[对不起-暂时发布的错误代码结果;立即修复]
PS我之所以使用requirejs,是因为我以后也想从浏览器中运行此代码(或其中的一些代码)。
更新/解决方案
以下答案中未包含的内容是我需要mocha -u tdd用于上述测试样式。这是最终测试(也需要断言)及其使用:
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)
您的测试未运行的原因是因为src/utils.js它不是有效的Node.js库。
根据RequireJS文档,为了与Node.js和CommonJS require标准共存,您需要在文件顶部添加一些样板,src/utils.js以便define加载RequireJS 函数。
define
但是,由于RequireJS被设计为能够要求“经典的”面向Web浏览器的源代码,因此我倾向于在我也要在浏览器中运行的Node.js库中使用以下模式:
if(typeof require != 'undefined') { // Require server-side-specific modules } // Insert code here if(typeof module != 'undefined') { module.exports = whateverImExporting; }
这样的优点是不需要其他Node.js用户使用额外的库,并且通常可以与客户端上的RequireJS一起使用。
一旦代码在Node.js中运行,就可以开始测试。我个人仍然喜欢Expresso而不是Mocha,尽管它是后继的测试框架。