【问题标题】:JavaScript test (mocha) with 'import' js file带有“导入”js 文件的 JavaScript 测试 (mocha)
【发布时间】:2014-02-20 16:51:23
【问题描述】:

我了解module.exportrequire 的方式:

Requiring external js file for mocha testing

虽然只要是模块就很好用,但我觉得这种方式很不方便,因为我现在要做的是测试文件中的代码。

例如,我在一个文件中有一个代码:

app.js

'use strict';
console.log('app.js is running');
var INFINITY = 'INFINITY';

现在,我想在一个文件中测试这段代码:

test.js

var expect = require('chai').expect;

require('./app.js');


    describe('INFINITY', function()
    {
        it('INFINITY === "INFINITY"',
            function()
            {
                expect(INFINITY)
                    .to.equal('INFINITY');
            });
    });

测试代码执行app.js,所以输出为;

app.js is running

然后

ReferenceError: INFINITY is not defined

这不是我所期望的。

我不想使用module.export 和写喜欢

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

app.INFINITYapp.anyOtherValue 用于测试代码中的每一行。

必须有一个聪明的方法。你能告诉我吗?

谢谢。

【问题讨论】:

    标签: javascript node.js unit-testing require mocha.js


    【解决方案1】:

    我通常包含一个 _test 对象,其中包含对我所有“私有”内部变量和函数的引用,并在导出时公开它。在你的情况下:

    ./app.js

    var INFINITY = 'infinity';
    
    function foo() {
        return 'bar';
    }
    
    exports._test = {
        INFINITY: INFINITY,
        foo: foo
    }
    

    ./test/app-test.js

    var app = require('../app.js')
    /* ... */
    it('should equal bar', function() {
        expect(app._test.foo()).to.equal('bar');
    });
    it('should equal infinity', function() {
        expect(app._test.INFINITY).to.equal('infinity');
    });
    

    【讨论】:

    • 谢谢。我明白你的回答。我会搜索一个解决方案来测试,而不需要修改测试代码,也不需要前缀对象来引用它。
    • 谢谢。我正在解决这个问题,完成后我会发布解决方案,敬请期待!
    • 我找到了解决方案,检查我的答案。
    【解决方案2】:

    更新:最终答案:

    我之前的回答无效,因为eval(code); 对变量没有用。

    幸运的是,node 有一个强大的方法 - vm

    http://nodejs.org/api/vm.html

    但是,根据文档,

    vm 模块有许多已知问题和边缘情况。如果您遇到问题或意外行为,请查阅 GitHub 上的未解决问题。下面描述了一些最大的问题。

    所以,虽然这在表面上是有效的,但对于像测试这样的目的需要额外的小心......

    var expect = require('chai')
        .expect;
    
    var fs = require('fs');
    var vm = require('vm');
    var path = './app.js';
    
    var code = fs.readFileSync(path);
    vm.runInThisContext(code);
    
    describe('SpaceTime', function()
    {
        describe('brabra', function()
        {
            it('MEMORY === "MEMORY"',
                function()
                {
                    expect(MEMORY)
                        .to.equal('MEMORY');
                })
        });
    
    });
    

    毕竟; 我在这种情况下找到的最好方法是 在同一个文件中编写测试 mocha 代码。

    【讨论】:

      猜你喜欢
      • 2017-11-21
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多