当前位置: 首页 > 面试题库 >

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

史骏祥
2023-03-14
问题内容

我试图了解如何开发独立的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)

问题答案:

您的测试未运行的原因是因为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,尽管它是后继的测试框架。



 类似资料:
  • 问题内容: 标题几乎可以解释我所面临的问题。我正在尝试测试具有某种状态的组件,并且试图为该组件提供存储以获取所需的组件。当我使用Jest运行组件的测试时,出现以下错误: 我已经通过了一些读数确定,这是造成或者没有被正确适用于玩笑。但是,我尝试安装这两个软件包并重新运行,但结果没有变化。阅读Jest Github问题页面(删除babel- polyfill的自动包含#2755 )后,我发现Jest从

  • 我得到以下错误时运行我的测试用例摩卡 有人知道为什么会这样吗? 包裹json physicalperson.spec.js 我所尝试的 我在SO中看到了一些线程,我也尝试了下面的代码,但出现了相同的错误。

  • 这个标题很大程度上解释了我面临的问题。我试图测试一个具有某种状态的组件,并试图将我的存储提供给该组件以获取它需要的内容。当我使用Jest运行组件的测试时,我得到以下错误: 通过一些阅读,我确定这是由或未正确应用于Jest造成的。但是,我已经尝试安装这两个软件包并重新运行,结果没有变化。在阅读Jest Github问题页面(删除babel polyfill#2755的自动包含)后,我发现自版本19起

  • 问题内容: var x int done := false go func() { x = f(…); done = true } while done == false { } 这是Go代码。我的恶魔告诉我,这是UB代码。为什么? 问题答案: Go Memory Model不保证该程序将始终遵守在goroutine中写入x的值。go常规销毁 部分中提供了一个类似的错误程序作为示例。 在本节中,G

  • 问题内容: 发生了最奇怪的事情,我的测试运行正常,但现在不再,我完全没有更改代码,这里是一个例外: 问题答案: 我看到您正在使用Eclipse,但您是否还在使用其他外部构建/测试工具,例如Ant或Maven?有时,在同时使用其他外部工具时,Eclipse可能会不同步。 如果使用外部工具,请执行清理生成的工件所需的所有操作(例如mvn clean)。然后刷新Eclipse项目并按照前面的建议进行干净

  • 我正在尝试测试一个空数据库/没有从数据库返回任何内容的场景。 我用mockito写了一个junit4测试类。有一个服务类和dao类是由mockito创建的。首先,我定义了“何时”方法,它起作用了。后来,我试着调用“when”方法,看看会发生什么,不管怎样,它工作了。为什么? 当myService.getDistinctObjectList()被调用时,myService类会调用myDao的所有四个