【问题标题】:Check for node modules being loaded using jasmine-node检查使用 jasmine-node 加载的节点模块
【发布时间】:2013-10-07 10:20:12
【问题描述】:

所以我试图通过学习 Mongoose 项目的教程、TDD 风格、为每个步骤应该完成的内容编写测试、然后按照实际教程等来自学 Jasmine(针对节点)。

当然,我的第一次测试失败了。

此时的app.js是两行:

var mongoose = require('mongoose');
console.log(mongoose.version);

这运行良好。然而,我的测试仍然失败:

var app = require('../src/app.js');

describe('App startup', function() {
    it('loads mongoose', function() {
            expect(app.mongoose.version).toBeDefined();
    });
    it('loads jasmine-jquery', function() {
            expect($).toBeDefined();
    });
});

结果

Failures:

1) App startup loads mongoose
Message:
 TypeError: Cannot read property 'version' of undefined
Stacktrace:
 TypeError: Cannot read property 'version' of undefined
at null.<anonymous> (/home/jbhelfrich/mongooseBlog/spec/init.spec.js:5:36)

(当然,此时 jquery 测试仍会失败。)我已经尝试过使用和不使用“应用程序”。在 expect 子句中,但我得到了同样的错误——测试套件看不到 app.js 的内部结构。但我知道它正在正确加载 app.js 文件,因为它正在运行它——console.log 输出出现在测试结果之前。

所以我怀疑我误解了有关范围的一些基本内容,或者其他一些新手错误,但我不确定那是什么。

【问题讨论】:

    标签: javascript node.js jasmine jasmine-node


    【解决方案1】:

    Node.js 被结构化为模块。如果您希望某个模块的属性可访问,则该模块的属性必须在module.exports 变量中定义。这就是导出的样子(注意exports 引用module.exports):

    var mongoose = require('mongoose');
    console.log(mongoose.version);
    exports.mongoose = mongoose;
    

    然后,当您在具有上述代码的文件上使用require() 时,将设置变量,其中app 相当于正在加载的模块中的module.exports

    var app = require('../src/app.js');
    console.log(app.mongoose.version);
    

    【讨论】:

    • 工作就像一个魅力,谢谢!是否有任何理由(安全性、性能)从生产代码中删除 export. 行,或者可以不理会它们?
    • 没有理由删除导出,因为如果您不导出变量,那么它们就无法在模块外部访问。
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 2015-06-18
    • 2014-03-03
    • 1970-01-01
    • 2017-07-25
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多