web-dev-qa-db-ja.com

node.jsを使用してクラスをエクスポートする

bob_test.spec.jsというファイル内のjasmine-nodeによって実行されている次のテストコードがあります。

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は、コンストラクター関数とモジュールのエクスポートで、これが機能しないのを防ぐために、どうすればよいのでしょうか?

33
mattr-

requireはオブジェクトを返します。どこかに格納する必要があります

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

そして、このオブジェクトを使用します

var bobInstance = new Bob();
54
mrvn

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();
2
Jonas Brandel

これにより、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);
1
user2647543

marvin's answer:

_"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();に渡すオブジェクトを作成できます

1
Novitoll