node.js - 在 Node 上将 RequireJS 与 Mocha 和 SquireJS 结合使用

标签 node.js requirejs mocha.js squirejs

我尝试在 Node 中使用 RequireJS,发现路径问题很困难。

这是一个返回“foo”的简单 foo 方法

$ cat src/foo.js 

define([], function() {

    var foo = function() {
        return "foo";
    };

    return { foo:foo};
});

这里是 bar 需要 foo,但它仅在指定相对路径时有效。事情应该是这样吗?

$ cat src/bar.js
define(['./foo.js'], function(foo) {

    var bar = function() {
        return foo.foo().replace("foo","bar");
    };

    return { bar : bar };
});

Mocha 测试中事情变得更加棘手:

  1. 加载 foo 和 bar 需要 __dirname 解决方法。
  2. bar 的异步加载失败(参见测试 3 和 4)。
  3. 导入 Squire 需要准确的路径,因为它是使用 npm install 安装的,但不符合标准的 Node require 语法,并且不包含 amdefine 解决方法:

这是测试代码:

$ cat test/footests.js 
var requirejs = require('requirejs');
var chai = requirejs("chai");
var should = chai.should();
var Squire = requirejs(__dirname + "/../node_modules/squirejs/src/Squire.js");

describe('when calling foo.foo()', function () {
   it('should return "foo"', function() {
        var foo = requirejs(__dirname + "/../src/foo.js");
        foo.foo().should.equal("foo");
    });
});

describe('when calling bar.bar()', function () {
    var bar = requirejs(__dirname + "/../src/bar.js");
    it('should return "bar"', function() {
        bar.bar().should.equal("bar");
    });
});

describe('when calling bar.bar() with async requirejs', function () {
    it('should return "bar"', function(done) {
        requirejs(__dirname + "/../src/bar.js", function(bar) {
            bar.bar().should.equal("bar");
            done();
        })
    });
});
describe('when mocking foo.foo() and calling bar.bar()', function () {
    it('should return "barbar"', function(done) {
        var injector = new Squire();
        var fooMock = {
            foo : function() {
                return "foofoo"; /* instead of just foo */
            }
        };
        injector
          .mock('./foo.js', fooMock)
          .require(__dirname + "/../src/bar.js", function(bar) {
              bar.bar().should.equal("barbar");
              done();
          });
    });
});

我已经在 github 上设置了复制品 https://github.com/itaifrenkel/node-requirejs-example

最佳答案

您的代码中存在多个问题:

  1. 不要将 .js 放在模块名称的末尾。添加 .js 告诉 RequireJS 绕过正常的模块名称解析。 (在某些情况下,您想要该扩展程序,但在这些情况下您应该可以说出为什么需要它。)

  2. Node 中的 RequireJS 可以进行配置,就像在浏览器中使用它一样。这样就无需在各处重复路径。

  3. RequireJS 可以使用 packages 设置加载包。

  4. 当不需要时,不要使用 RequireJS 加载 Node 模块。 (例如,chai 不需要使用 RequireJS 加载。)

如果我修改 bar.js 以从其单独的依赖项中删除 .js 扩展名并使用以下测试文件,则它可以工作:

var requirejs = require('requirejs');
requirejs.config({
    baseUrl: __dirname + "/../src",
    packages: [
        {
            name: "squirejs",
            location: "../node_modules/squirejs",
            main: "src/Squire"
        }
    ]
});
var chai = require("chai");
var should = chai.should();
var Squire = requirejs("squirejs");

describe('when calling foo.foo()', function () {
   it('should return "foo"', function() {
        var foo = requirejs("foo");
        foo.foo().should.equal("foo");
    });
});

describe('when calling bar.bar()', function () {
    var bar = requirejs("bar");
    it('should return "bar"', function() {
        bar.bar().should.equal("bar");
    });
});

describe('when calling bar.bar() with async requirejs', function () {
    it('should return "bar"', function(done) {
        requirejs(["bar"], function(bar) {
            bar.bar().should.equal("bar");
            done();
        });
    });
});
describe('when mocking foo.foo() and calling bar.bar()', function () {
    it('should return "barbar"', function(done) {
        var injector = new Squire();
        var fooMock = {
            foo : function() {
                return "foofoo"; /* instead of just foo */
            }
        };
        injector
          .mock('./foo', fooMock)
          .require(["bar"], function(bar) {
              bar.bar().should.equal("barfoo");
              done();
          });
    });
});

关于node.js - 在 Node 上将 RequireJS 与 Mocha 和 SquireJS 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361700/

相关文章:

javascript - 使用 SammyJS 和 requireJS 来路由模块

javascript - Mocha/Chai 测试预期与实际对象数组

node.js - 使用 'supertest' 进行测试期间的 Express 中间件控制台输出

node.js - 收到错误 - 在 Windows 机器上监听 EADDRINUSE:::3000

http - 哪个 node.js HTTP 代理实现性能更高?

requirejs - 使用 requirejs 部署仅 javascript 的单页应用程序

javascript - 当我将多个 Controller 添加到同一模块时,Angular - Mocha - 测试失败

node.js - Sails.js:哪些模块用于单元测试?

javascript - 如何正确设置 Node、Express 和 Angular2

javascript - 如何编写一个可以与 Node.js、RequireJS 以及没有它们一起工作的模块