使用RequireJS运行Mocha测试时,为什么会看到"define not defined"?

and*_*oke 37 javascript mocha.js node.js npm requirejs

我试图了解如何开发独立的Javascript代码.我想编写带有测试和模块的Javscript代码,从命令行运行.所以,我已经安装node.js,并npm与库一起requirejs,underscoremocha.

我的目录结构如下所示:

> 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中运行代码,就可以开始测试了.我个人仍然更喜欢表达摩卡,尽管它是后继测试框架.


mwi*_*cox 5

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