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?
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();
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();
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);
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();