nodejs使用rewire和mocha进行测试SyntaxError:意外的令牌

时间:2015-09-23 16:00:45

标签: javascript node.js unit-testing mocha

我正在尝试测试从nodejs上的文件导出的函数。我也用q来处理承诺。该函数返回一个内部回调解析/拒绝的promise。在这个回调中,它从另一个返回另一个promise的地方调用另一个函数。当第二个承诺完成后,我解决或拒绝返回的承诺。 在测试中我想模拟第二个函数,所以我使用rewiresinon传递一个存根,它返回一个我在测试时手动解析的promise。 问题是当我尝试模拟这个函数然后我得到输出:SyntaxtError: Unexpected token .

我在Windows 7上。

重新布线模块中是否有任何遗漏?

错误:

      1) Calls the createConfFiles just once


  1 passing (113ms)
  1 failing

  1) Setup scripts management configuration on current dir base on user inputs d
sdsdsd Calls the createConfFiles just once:
     SyntaxError: Unexpected token .
      at Function.__set__ (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\mai
n\webapp\dirigent\bin\init\scripts.js:102:19)
      at Context.<anonymous> (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\
main\webapp\dirigent\bin\init\scriptst.test.js:47:21)
      at callFnAsync (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\main\web
app\dirigent\node_modules\mocha\lib\runnable.js:306:8)
      at Test.Runnable.run (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\ma
in\webapp\dirigent\node_modules\mocha\lib\runnable.js:261:7)
      at Runner.runTest (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\main\
webapp\dirigent\node_modules\mocha\lib\runner.js:421:10)
      at D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\main\webapp\dirigent\
node_modules\mocha\lib\runner.js:528:12
      at next (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\main\webapp\dir
igent\node_modules\mocha\lib\runner.js:341:14)
      at D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\main\webapp\dirigent\
node_modules\mocha\lib\runner.js:351:7
      at next (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\src\main\webapp\dir
igent\node_modules\mocha\lib\runner.js:283:14)
      at Immediate._onImmediate (D:\p4\rcalvo_DEV-OB\Enterprise\static-content\s
rc\main\webapp\dirigent\node_modules\mocha\lib\runner.js:319:5)



npm ERR! Test failed.  See above for more details.

测试文件:

var expect = require('chai').expect;
var sinon = require('sinon');
var rewire = require('rewire');
var Q = require('q');
var inquirers = require('./mocks.js').inquirers;
var Scripts;

describe('Setup scripts management configuration on current dir base on user inputs', function () {

    var createConfigFiles;
    var defer;

    describe('Call once the createConfFiles function', function () {
        before(function () {
            Scripts = rewire('./scripts.js');
        });
        it('Calls the createConfFiles just once', function (done) {
            defer = Q.defer();
            createConfigFiles = sinon.stub().returns(defer.promise);
            Scripts.__set__({
                'inquirer': inquirers.buildScripts,
                './createConfigFiles.js': createConfigFiles
            });
            Scripts().then(function (result) {
                expect(result).to.equal("Yes");
                expect(createConfigFiles.calledOnce).to.be.true;
                done();
            }).done();

            defer.resolve(true);
        });
    });

});

经过测试的功能:

function init() {
    process.stdout.write('\nScripts\n');
    inquirer.prompt(question, function (answer) {
        if (answer.scripts === choices[0]) {
           Q.when(createScriptsConfFile(ioOptions))
                .then(function (result) {
                    defer.resolve(choices[0]);
               }, function (error) {
                   defer.reject(error);
               }).done();
        } else {
            defer.reject(answer.scripts);
        }
    });

    return defer.promise;

};
// exported as recomended here https://github.com/jhnns/rewire/issues/22
module.exports = init;

1 个答案:

答案 0 :(得分:1)

在查看了重新连接的代码后,我发现他们构建了一个字符串,其中包含模块名称和重新创建赋值的值。然后使用eval评估字符串。如果你想模拟一个文件的导出值,这将不起作用,因为变量名称将无效,因为它以点开头。因此奇怪的错误&#39; SyntaxtError:意外的令牌。&#39;。我用mockery取代了重新布线,一切正常。

var defer;
before(function () {
    defer = Q.defer();
    mockery.enable({
        warnOnReplace: false,
        warnOnUnregistered: false,
        useCleanCache: true
    });
    mockery.registerMock('inquirer', inquirers.buildScripts);

    createConfigFiles = sinon.stub().returns(defer.promise);
    mockery.registerMock('./createConfigFiles.js', createConfigFiles);

});

it('Calls the createConfFiles just once', function (done) {
    var scripts = require('./scripts.js');
    scripts().then(function (result) {
        expect(result).to.equal("Yes");
        expect(createConfigFiles.calledOnce).to.be.true;
        done();
    }).done();

    defer.resolve(true);
});


after(function () {
    mockery.disable();
});