首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >npm + Mocha + RequireJS

npm + Mocha + RequireJS
EN

Stack Overflow用户
提问于 2014-04-02 20:12:08
回答 1查看 4.1K关注 0票数 12

我有相当多的时间尝试用Mocha和RequireJS建立节点/npm。这就是我所做的。

我创建了一个测试/目录,其结构如下:

代码语言:javascript
复制
testing/
   |
   +-- package.json
   |
   +-- README.md
   |
   +-- test/
         |
         +-- mocha.opts
         |
         +-- widgets/
                |
                +--mywidget/
                       |
                       +-- test.js

以下是每个相关文件所包含的内容:

package.json:

代码语言:javascript
复制
{
    "name":"testing-project",
    "version":"2.5.0",
    "description":"Testing Project",
    "keywords":["test"],
    "engines": { "node": ">= 0.7.0 < 0.11.0" },
    "scripts" : {
        "test": "./node_modules/.bin/mocha"
    },
    "devDependencies": {
        "mocha": ">= 1.18.2",
        "requirejs": ">= 2.1.11",
        "should": ">= 3.2.0",
        "expect.js": ">= 0.3.1"
    }
}

测试/mocha.opts:

代码语言:javascript
复制
--require expect.js
--require should
--require requirejs
--require mocha
--reporter spec
--ui tdd
--recursive
--growl

test/widget/mywidget/test.js

代码语言:javascript
复制
'use strict';
var requirejs = require('requirejs');
// Also tried with:  require('../../../r.js')  which I downloaded from RequireJS' site

requirejs.config({
    baseUrl: '../../../../',
    nodeRequire: require
});

console.log('before require');
requirejs(['mywidget/trunk/src/mywidgetfile.js'], function(myObj){
    console.log('after require');

    var expect = require('expect.js');

    // Instead of the above "requirejs['mywidget..." line, I've also tried:
    // var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js');   AND:
    // var myObj = requirejs('../../../../mywidget/trunk/src/mywidgetfile.js');

    describe('My Widget', function(){
        describe('my-widget#getInfo', function(){

            it('should pass this test', function(done){
                expect( myObj.returnString('test') ).to.equal( 'test' );

                done();
            })
        })
    });
});
console.log('done');

它将输出控制台行“use”和"done",但只要我有require ([‘mywidget.行in ),它就不会按后请求。如果我删除了require行(以及相应的结束括号/ myObj行),而使用直接的"var myObj =“行,我就会得到”无法找到模块“,如果我使用第二个"var myObj”行,我就会得到“引用错误:未定义定义”。

为了方便其他开发人员使用npm,我尝试将所有这些都打包,这样我就可以从顶部的“test/”目录中运行命令"npm“。

我一直在寻找答案,尝试了很多事情,但我似乎不需要使用RequireJS的文件,并且定义了“defined ()”。我可以做测试,这不是问题.它只是试图将RequireJS插入混合,这是当我开始有问题。

任何帮助都会是巨大的!

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-02 22:24:05

在你展示给我们的东西中有很多问题在发生。您错误地同时使用了RequireJS和Mocha。

RequireJS

我很确定你的baseUrl是不正确的。您似乎认为,当Mocha在test/widgets/mywidget/test.js中执行测试时,它的当前工作目录将被设置为test/widgets/mywidget/test.js。事实并非如此。当您运行npm test时,工作目录就在您所处的位置。根据您的描述,运行它时您在testing/中。我不清楚你的baseUrl应该是什么价值,因为你没有在你的问题中提供足够的信息,但我相信,从我刚才给你的解释中,你可以找出答案。

现在,您可能会认为“当然,我的baseUrl是正确的,因为当我执行requirejs(['mywidget/trunk/src/mywidgetfile.js'], function(myObj){时,我不会收到错误”。这将是一个错误的推论。虽然这个requirejs调用安排了模块的加载,但RequireJS没有机会尝试加载它,因为Mocha在RequireJS试图加载它之前就退出了。您可以通过用完全垃圾替换模块路径来检查这一点,这样就不会出现错误。

一旦您修复了这个baseUrl问题,使用var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js')就会像您预期的那样工作。因此,您将能够避免使用异步形式的require (这是使用依赖数组作为第一个参数的形式)。(您使用的requirejs函数只是RequireJS文档中通常称为require的函数的别名)。

摩卡咖啡

您的测试没有运行,因为Mocha看不到它们。Mocha的工作方式是读取它找到的所有测试文件,然后执行它们。每个describe调用的回调立即执行,对每个it调用的回调被记录为要运行的测试。一旦Mocha确定了存在什么测试,它就会运行它们。

您的测试文件所发生的情况是,Mocha像往常一样执行它。但是,在测试文件的顶部范围内没有调用describeit。您的回调中有对requirejs的调用,但请记住我前面说过的话: RequireJS没有加载模块的机会,所以它没有机会运行回调。(即使运行了,也为时已晚。)所以Mocha不会马上看到任何测试和出口。

前进之路

找出您需要的baseUrl,然后这个方法就能工作了:

代码语言:javascript
复制
'use strict';
var requirejs = require('requirejs');

requirejs.config({
    baseUrl: <whatever value is needed here>,
    nodeRequire: require
});

var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js');

describe('My Widget', function() {
// etc...

您还可以考虑将RequireJS完全从测试套件中删除。我编写了一个库,它在Node和浏览器中工作得一样好。它由AMD模块组成,由RequireJS在浏览器中加载,但我在测试套件中不使用RequireJS。这是我用来在Node中加载模块的装载机。还有一些阿姆,我还没有使用过,但是应该提供类似的功能。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22822018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档