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

时间:2013-12-23 18:11:29

标签: mysql node.js mocha

我正在使用在nodejs实例中运行的mocha来测试存储过程。我有这个测试骨架:

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 () {});
}

问题:我的测试总是在异步模式下运行,尽管我的所有测试都是这样编写的:

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

没有done()回调,我的意思是没有,所以,因为在任何地方都提到默认情况下mocha.js是同步的,这可能是我的代码在异步模式下运行的原因?

PATCH

要解决我的问题,我必须使用before()并检查我的测试状态,但这将成为维护的噩梦。

1 个答案:

答案 0 :(得分:12)

您正在运行在同步mocha测试中异步的操作。

说摩卡测试是“同步”是不明确的。这可能意味着:

  • 测试测试的操作同步进行。
  • Mocha以同步方式处理测试。

这两者并不相同。一个不需要另一个。默认情况下,Mocha同步处理所有测试。我们可以让它异步处理测试,但是将参数添加到我们传递给it(或其他测试接口中的等价物)的回调中。 (后来版本的Mocha最终添加了另一种方法让Mocha异步处理测试:返回一个promise。但是我将使用回调来获得以下示例。)所以我们可以有4种同步组合:

  • 同步操作,Mocha测试同步。

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

    没问题。

  • 同步操作,Mocha测试异步。

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

    让Mocha测试异步是没有意义的,但没问题。

  • 异步操作,Mocha测试异步。

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

    没问题。

  • 异步操作,Mocha测试同步。

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

    这是一个问题。 Mocha会立即从测试回调中返回并调用它成功(假设fs.readFile没有引发异常)。仍将调度异步操作,稍后可能仍会调用回调。这里有一个重点:Mocha没有能力使它测试的操作同步。因此,使 Mocha测试同步对测试中的操作没有影响。如果它们是异步的,它们将保持异步,无论我们告诉Mocha。

最后一种情况,在您的系统中,将导致存储过程的执行与DB系统一起排队。如果这个排队没有错误发生,摩卡立即完成。然后,如果有文件更改,您的观察者将启动另一个Mocha运行并且更多操作排队等等。