【问题标题】:Cannot run Mocha.js in synchronous mode无法在同步模式下运行 Mocha.js
【发布时间】:2014-01-11 23:44:50
【问题描述】:

我正在使用在 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 默认是同步的,我的代码在异步模式下运行的原因可能是什么?

补丁

为了修补我的问题,我不得不使用 before() 并检查我的测试状态,但这变成了维护的噩梦。

【问题讨论】:

  • 是什么症状导致您得出 mocha 正在异步运行您的测试的结论?
  • 我在节点检查器中运行这些测试,我可以通过断点确认测试是并行运行的。我把调试器带到了救援中,以发现为什么我的测试不连贯。
  • 如何同步调用存储过程?你说的是db存储过程吧?

标签: mysql node.js mocha.js


【解决方案1】:

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

说 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 什么,它们都将保持异步。

最后一种情况,在您的系统中会导致存储过程的执行与数据库系统一起排队。如果这个排队没有错误发生,Mocha 会立即结束。然后,如果有文件更改,您的 watcher 会启动另一个 Mocha 运行,并且更多操作会排队,等等。

【讨论】:

  • 您可能指出了我的困惑并清楚地解释了我正在试验的行为。这是有道理的:我在同步 mocha 运行模式下测试了异步调用(调用 nodejs mysql 模块)。我很惊讶 Mocha 不会“有点”等待测试人员的特定回调来消除测试人员职责中的这种歧义。
  • 嗨@Louis,你对如何处理第4个例子有什么建议?
  • @Mageshkhanna 您必须将其转换为第一种或第三种情况。在我作为示例显示的代码中,这意味着使用fs.readFileSync(第一种情况)或将函数传递给it,采用done 参数,并在回调(第三种)情况下调用它。
猜你喜欢
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多