it-swarm.com.de

Klassen mit node.js exportieren

Ich habe den folgenden Testcode, der von Jasmin-Knoten in einer Datei namens bob_test.spec.js ausgeführt wird.

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');
  });
});

Um den Test zu bestehen, habe ich den folgenden Produktionscode in eine Datei mit dem Namen bob.js geschrieben.

"use strict";

var Bob = function() {
}

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

module.exports = Bob;

Wenn ich den Test mit jasmine-node . durchführe, erhalte ich folgendes 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

Basierend auf dem, was ich über Javascript verstehe, denke ich, dass dies funktionieren sollte. Was macht node.js mit Konstruktorfunktionen und Modulexporten anders, was verhindert, dass dies funktioniert? 

32
mattr-

wenn ein Objekt zurückgegeben werden soll, sollten Sie es irgendwo ablegen

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

und dann dieses Objekt verwenden

var bobInstance = new Bob();
52
mrvn

Wenn Sie ECMAScript 2015 verwenden können, können Sie Ihre Klassen deklarieren und exportieren und anschließend mithilfe von Destrukturierung "importieren", ohne dass Sie ein Objekt verwenden müssen, um zu den Konstruktoren zu gelangen.

Im Modul exportierst du so

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

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

module.exports = {
    Person,
    Animal
};

dann wo du sie benutzt

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

const animal = new Animal();
const person = new Person();
2
Jonas Brandel

Dies sollte den Fehler beheben, den Sie beim Ausführen Ihrer Tests über Jasmin-Knoten hatten:

// 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

Marvins Antwort verbessern:

"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');

Sie können also ein Objekt erstellen, das an module.exports module.exports = new Bob(); übergeben wird.

1
Novitoll