摩卡testing超时使用承诺和跳过代码,为什么?

我一直试图连续运行这个testing2天,我无法弄清楚它有什么问题:

/*eslint-env mocha */ // var expect = require('chai').expect; var chai = require('chai'); var chaiAsPromised = require("chai-as-promised"); var expect = chai.expect; var Promise = require('bluebird'); var Archive = require('../lib/archive'); var path = require('path'); var fs = Promise.promisifyAll(require('fs-extra')); var globAsync = Promise.promisify(require('glob')); var tar = require('tar-fs'); var zlib = Promise.promisifyAll(require('zlib')); chai.use(chaiAsPromised); describe('Archive', function() { var pkg; var archive_location; var subject; beforeEach(function() { pkg = { name: 'test_0790feebb1', recipient_name: 'Test', files: { letter: '../documents/letters/test/letter.tex', resume: '../documents/cover/cover.tex' }, compiled_files: { package: '../documents/letters/test/test.pdf' } }; archive_location = path.resolve('archives/test_0790feebb1.tar.gz'); subject = new Archive(pkg); }); after(function() { return globAsync('archives/test*') .each(function(filename) { return fs.removeAsync(filename); }); }); describe('#make', function() { it('has the correct directory structure', function() { // debugger; var tmp_extract_path = path.resolve('test/.tmp'); var tarPromise = function(data) { console.log('tarP'); // never run return new Promise(function(reject, resolve) { data .pipe(zlib.Unzip()) .pipe(tar.extract(tmp_extract_path)) .on('error', reject) .on('end', resolve); }); }; var verifyDir = function() { console.log('verD'); // never run return Promise.all([ 'code', 'pdf', 'code/repo', 'code/documents', 'code/documents/letters', 'code/documents/letters/test', 'code/documents/letters/shared', 'code/documents/cover', 'code/documents/letters' ].map(function(subpath) { return fs.statAsync(path.resolve(tmp_extract_path, subpath)); })); }; return fs.createReadStreamAsync(archive_location) .then(function(data) { return tarPromise(data); }) .then(function() { return verifyDir(); }) .then(function(files) { console.log(files); // never run return expect(true).to.be.true; }) .catch(function(e) { console.log(e); }); }); }); }); 

各种console.log甚至不会执行,最终testing超时而没有任何错误或堆栈跟踪。

我不知道自己做错了什么,承诺伤害了我的大脑。 当我用节点检查器运行代码并取消注释断点时,我可以看到他对this._runnable._trace值是"done() called multiple times" 。 我不知道这是否是一个实际的错误,也不知道为什么它不会抛出exception,如果这是一个错误。 我不能解释为什么这是甚至发生,因为我没有使用任何done()callback承诺和我的testing开始与function()而不是function(done)像asynchronoustesting会

有任何想法吗?

你的问题是, fs.createReadStream是同步的,并返回一个ReadableStream,以块的forms将数据读入内存。 PromisifyAll将callback函数转换为承诺的asynchronous函数,而不是将同步函数转换为asynchronous函数。

可能你想要的是使用fs.readFileAsync

 var Promise = require('bluebird'); var fs = Promise.promisifyAll(require('fs')); var path = require('path') var archive_location = path.resolve('example.zip'); var assert = require('assert'); describe('This', function(){ it('should work', function(){ return fs.readFileAsync(archive_location). then(function(data) { assert.notEqual(data.length, data.length); return data; }). catch(console.log); }); }); 

我把这个断言设置成一个失败的断言来certificate这实际上触及了承诺链。