web-dev-qa-db-fra.com

Exportation de classes avec node.js

J'ai le code de test suivant qui est exécuté par jasmine-node dans un fichier appelé 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');
  });
});

Afin de réussir le test, j'ai écrit le code de production suivant dans un fichier appelé bob.js

"use strict";

var Bob = function() {
}

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

module.exports = Bob;

Lorsque je lance le test - en utilisant jasmine-node . - je reçois ce qui suit 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

D'après ce que j'ai compris à propos de Javascript, je pense que cela devrait fonctionner. Qu'est-ce que node.js fait différemment avec les fonctions de constructeur et les exportations de modules qui empêchent que cela fonctionne, j'aime bien le faire? 

32
mattr-

exiger le retour d'un objet, vous devez le stocker quelque part

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

et ensuite utiliser cet objet

var bobInstance = new Bob();
52
mrvn

Si vous pouvez utiliser ECMAScript 2015, vous pouvez déclarer et exporter vos classes, puis «importer» vos classes en utilisant la déstructuration sans qu'il soit nécessaire d'utiliser un objet pour accéder aux constructeurs.

Dans le module, vous exportez comme ceci

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

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

module.exports = {
    Person,
    Animal
};

alors où vous les utilisez

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

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

Cela devrait corriger l'erreur que vous aviez lors de l'exécution de vos tests via 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

Améliorer marvin's réponse:

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

Vous pouvez donc créer un objet en le transmettant à module.exports module.exports = new Bob();

1
Novitoll