2013-08-02 15 views
32

導出類我已經正在由茉莉節點在一個文件中運行下面的測試代碼中調用bob_test.spec.js與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'); 
    }); 
}); 

爲了使測試通過,我已經寫了下面的生產在一個文件中的代碼調用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與構造函數和模塊導出有什麼不同,它阻止了它的運行我喜歡它應該這樣做?

回答

50

需要返回一個對象,你應該存儲在某個地方

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

,然後使用這個對象

var bobInstance = new Bob(); 
+0

太好了!這是一個挽救生命的問題 –

1

這應該可以解決,同時通過茉莉節點運行測試您遇到的錯誤:

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

改善marvin's回答:

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

+10

雖然這不會讓你想要的東西,但是這會創建一個單身人士,尤其是如果該類具有寫入的私有變量,因爲它將在所有使用* Bob *目的。更好的方法是導出* Bob *,然後在你想要使用它的模塊中實例化它。 – sk4l

0

如果你可以用2015年的ECMAScript你可以聲明和出口的類,然後「進口」類中使用,無需解構使用一個對象來到構造函數。

在您導出這樣

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