2013-08-02 18 views
32

Mam następujący kod testu, który jest prowadzony przez jaśminu-węzła w pliku o nazwie bob_test.spec.jseksportujący zajęcia z node.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'); 
    }); 
}); 

Aby przepustkę testową, pisałem następujące produkcje kod w pliku o nazwie bob.js

"use strict"; 

var Bob = function() { 
} 

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

module.exports = Bob; 

Kiedy uruchamiam test - stosując jasmine-node . - pojawia się następujący 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 

Na podstawie tego, co rozumiem przez JavaScript, mam wrażenie, że to powinno działać. Co robi node.js w inny sposób z funkcjami konstruktora i eksportami modułów, które uniemożliwiają działanie?

Odpowiedz

50

wymagają Zwraca obiekt, należy go przechowywać gdzieś

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

a następnie użyć tego obiektu

var bobInstance = new Bob(); 
+0

świetnie! to jest ratownik na życie –

1

To powinno naprawić błąd mieli natomiast wyświetlanie testy poprzez jaśminowym-węzła:

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

Poprawa marvin's odpowiedź:

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

Więc można utworzyć obiekt przekazaniem go do module.exports module.exports = new Bob();

+10

Stworzy to singleton, który nie jest czymś, czego możesz chcieć, zwłaszcza jeśli klasa ma zmienną prywatną, do której pisze, ponieważ będzie ona udostępniona we wszystkich przypadkach, w których używasz * Boba * obiekt. Lepszym sposobem jest wyeksportowanie tylko * Boba *, a następnie utworzenie go w module, który ma zamiar z niego korzystać. – sk4l

0

Jeśli można użyć ECMAScript 2015 można zadeklarować i eksportować swoje klasy, a następnie „przywóz” twoje zajęcia z użyciem demontażu struktury bez konieczności użyj obiektu, aby dostać się do konstruktorów.

W module eksportowanego jak ten

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

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

module.exports = { 
    Person, 
    Animal 
}; 

to gdzie je wykorzystać

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

const animal = new Animal(); 
const person = new Person();