2013-08-02 5 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

Если вы можете использовать ECMAScript 2015 вы можете объявлять и экспортировать классы, а затем «импортировать» ваши классы с использованием, без уничтожения того необходимостью используйте объект для доступа к конструкторам.

В модуле экспортируемого как этот

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