我正在尝试测试从nodejs上的文件导出的函数。我也用q来处理承诺。该函数返回一个内部回调解析/拒绝的promise。在这个回调中,它从另一个返回另一个promise的地方调用另一个函数。当第二个承诺完成后,我解决或拒绝返回的承诺。
在测试中我想模拟第二个函数,所以我使用rewire从sinon传递一个存根,它返回一个我在测试时手动解析的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;
答案 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();
});