使用 Mocha 进行测试:基于 Promise 的测试不会自行运行?

Posted

技术标签:

【中文标题】使用 Mocha 进行测试:基于 Promise 的测试不会自行运行?【英文标题】:Testing express with Mocha: a promise-based test will not run by itself? 【发布时间】:2017-01-10 16:12:42 【问题描述】:

我有两个测试文件。当只存在 test1.js 时,不会运行任何测试,并且 mocha 报告“0 通过”测试。当 test1.js 和 test2.js 存在但都依赖于一个 Promise 时,仍然没有运行测试并且 mocha 仍然报告“0 通过”。但是当其中一个测试被修改为不使用 Promise 时,mocha 会运行这两个测试并且它们都成功了。有没有搞错?这是我的文件:

index.js:

require('./server').then( function(server) 
  server.listen(8080, function() 
  console.log("Started server");
  );
);

server.js:

var express = require('express');
var server = express();

module.exports = new Promise((function(resolve, reject) 
  return resolve(server);
));

test1.spec.js:

require('./server').then(function(server) 
  describe('Test Suite #1', function () 
    it('should run test #1', function testSomething(done) 
      return done();
    );
  );
);

test2.spec.js(server.js 用作promise,测试运行):

require('./server').then(function(server) 
  describe('Test Suite #2', function () 
    it('should run test #2', function testSomethingElse(done) 
      return done();
    );
  );
);

test2.spec.js(server.js 用作promise,两个测试都运行):

var server = require('./server');
describe('Test Suite #2', function () 
  it('should run test #2', function testSomethingElse(done) 
    return done();
  );
);

要运行它们,我只需安装并运行 nodejs、express 和 mocha:

% mocha "*.spec.*"

我知道我在这些示例中没有使用 server 变量,但当然真正的测试需要返回一个 promise,因为有时 server.js 正在访问远程系统以获取配置数据。我可以解决这个问题,但是对于理解这里发生的事情的任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您需要同步描述和定义所有测试。否则他们不会被 mocha 识别。如果您要进行一些异步设置,请使用 before 或 beforeEach 函数:

describe('Test Suite #1', function () 
  var server;
  before(function(done)
    require('./server').then(aServer => 
      server = aServer;
      done();
    );
  );
  it('should run test #1', function testSomething(done) 
    return done();
  );
);

【讨论】:

以上是关于使用 Mocha 进行测试:基于 Promise 的测试不会自行运行?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mocha 测试 Promise 时发生错误

使用 Promise 并跳过代码时,Mocha 测试超时,为啥?

使用 Mocha 和 Chai-as-Promised 测试被拒绝的 Promise 的特定属性

对 Promise 结果运行多个测试 - Mocha

用 Mocha 测试 Promise [重复]

如何用 Mocha 测试 Promise catch