38

我有以下由 jasmine-node 在名为的文件中运行的测试代码bob_test.spec.js

require('./bob');

describe("Bob", function() {
  var bob = new Bob();

  it("stating something", function() {
    var result = bob.hey('Tom-ay-to, tom-aaaah-to.');
    expect(result).toEqual('Whatever');
  });
});

为了使测试通过,我在一个名为的文件中编写了以下生产代码bob.js

"use strict";

var Bob = function() {
}

Bob.prototype.hey = function (text) {
  return "Whatever";
}

module.exports = Bob;

当我运行测试时 - 使用jasmine-node .- 我得到以下 F

Failures:

1) Bob encountered a declaration exception
Message:
    ReferenceError: Bob is not defined
Stacktrace:
    ReferenceError: Bob is not defined
    at null.<anonymous> (/Users/matt/Code/oss/deliberate-practice/exercism/javascript/bob/bob_test.spec.js:4:17)
    at Object.<anonymous> (/Users/matt/Code/oss/deliberate-practice/exercism/javascript/bob/bob_test.spec.js:3:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)

Finished in 0.02 seconds
1 test, 1 assertion, 1 failure, 0 skipped

根据我对 Javascript 的了解,我觉得这应该可行。node.js 与构造函数和模块导出有什么不同,阻止它工作我认为它应该?

4

4 回答 4

60

require 返回一个对象,你应该把它存储在某个地方

var Bob = require('./bob');

然后使用这个对象

var bobInstance = new Bob();
于 2013-08-02T15:03:55.197 回答
10

如果您可以使用 ECMAScript 2015,您可以声明和导出您的类,然后使用解构“导入”您的类,而无需使用对象来访问构造函数。

在你这样导出的模块中

class Person
{
    constructor()
    {
        this.type = "Person";
    }
}

class Animal{
    constructor()
    {
        this.type = "Animal";
    }
}

module.exports = {
    Person,
    Animal
};

那么你在哪里使用它们

const { Animal, Person } = require("classes");

const animal = new Animal();
const person = new Person();
于 2018-03-02T20:26:54.760 回答
1

这应该可以解决您在通过 jasmine-node 运行测试时遇到的错误:

// Generated by CoffeeScript 1.6.2
(function() {
  var Bob;

  Bob = (function() {
    function Bob() {}

    Bob.prototype.hey = function(what) {
      return 'Whatever.';
    };

    return Bob;

  })();

  module.exports = Bob;

}).call(this);
于 2013-08-02T23:05:57.757 回答
1

改进马文的答案:

"use strict";
var Bob = function() {}

Bob.prototype.hey = function (text) {
  return "Whatever";
}

module.exports = new Bob();

// another file
var Bob = require('./bob');
Bob.hey('text');

因此,您可以创建一个将其传递给 module.exports 的对象module.exports = new Bob();

于 2015-05-17T11:42:09.857 回答