无法在同步模式下运行Mocha.js

我正在用一个nodejs实例运行mochatesting存储过程。 我有这个testing框架:

var chai = require('chai'), MyReporter = require("../MyReporter.js"), chokidar = require('chokidar'), expect = chai.expect, should = chai.should, assert = chai.assert; var Mocha = require('mocha'); amochai = new Mocha({ bail: false, debug: true }); amochai.addFile("mytest_v1.js"); function runMocha(callback) { amochai.run(function () { callback(); }); } watcher.on('change', function(path, stats) { runMocha(function () {}); } 

问题 :我的testing总是以asynchronous模式运行,尽pipe我所有的testing都是这样写的:

 describe('Mysql stored procedures', function(){ describe('Add this data', function(){ it('-- Should return this information', function(){ // asserts }); }); }); 

没有done()callback,我的意思是任何地方,所以,正如在任何地方都提到,mocha.js是默认同步的,可能是我的代码在asynchronous模式下运行的原因是什么?

补丁

为了修补我的问题,我必须使用before()并检查我的testing状态,但是这成为一个噩梦来维护。

您正在运行同步摩卡testing中的asynchronous操作。

说摩卡testing是“同步”是模棱两可的。 这可能意味着:

  • testingtesting的操作是同步进行的。
  • 摩卡同步处理testing。

这两个不相同。 一个不需要另一个。 默认情况下,Mocha同步处理所有testing。 我们可以使其asynchronous处理一个testing,但为我们传递给it的callback(或其他testing接口中的等价物)添加一个参数。 (后来的Mocha版本最终增加了另外一种方法来让Mochaasynchronous地处理一个testing:返回一个promise,但是我将使用下面的例子来callback)所以我们可以有4种同步的组合:

  • 操作同步,摩卡testing同步。

     it("reads foo", function () { fs.readFileSync("foo"); // ssert what we want to assert. }); 

    没问题。

  • 操作同步,摩卡testingasynchronous。

     it("reads foo", function (done) { fs.readFileSync("foo"); // Assert what we want to assert. done(); }); 

    摩卡testing是asynchronous的,没有问题。

  • 操作asynchronous,摩卡testingasynchronous。

     it("reads foo", function (done) { fs.readFile("foo", function () { // Assert what we want to assert. done(); }); }); 

    没问题。

  • 操作asynchronous,摩卡testing同步。

     it("reads foo", function () { fs.readFile("foo", function () { // Assert what we want to assert. }); }); 

    这是个问题。 摩卡将立即返回testingcallback,并称之为成功(假设fs.readFile不会引发任何)。 asynchronous操作仍将被调度,并且callback可能会在稍后调用。 这里重要的一点是:摩卡没有能力使testing的操作同步。 所以使Mochatesting同步对testing中的操作没有影响。 如果他们是asynchronous的,他们将保持asynchronous,不pipe我们告诉摩卡。

最后一种情况,在您的系统中会导致存储过程的执行与DB系统排队。 如果这个排队没有错误发生,摩卡完成马上。 然后,如果文件发生变化,您的监视器将启动另一个Mocha运行,更多操作将排队等。