一尘不染

为什么在使用RequireJS运行Mocha测试时看到“未定义定义”?

node.js

我试图了解如何开发独立的Javascript代码。我想用命令行运行测试和模块编写Javscript代码。所以,我已经安装node.js,并npm伴随着图书馆requirejsunderscoremocha

我的目录结构如下所示:

> tree .
.
├── node_modules
├── src
│   └── utils.js
└── test
    └── 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是测试:

> 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目录):

> 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)
    ...

所以我的问题是:

  • 这是构造代码的正确方法吗?
  • 为什么我的测试无法运行?
  • 学习这种东西的最好方法是什么?我很难在Google上找到好的例子。

谢谢…

[对不起-暂时发布的错误代码结果;立即修复]

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)

阅读 285

收藏
2020-07-07

共1个答案

一尘不染

您的测试未运行的原因是因为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;
}

这样的优点是不需要其他Node.js用户使用额外的库,并且通常可以与客户端上的RequireJS一起使用。

一旦代码在Node.js中运行,就可以开始测试。我个人仍然喜欢Expresso而不是Mocha,尽管它是后继的测试框架。

2020-07-07