我正在使用在Node.js实例中运行的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测试中异步的操作。
说Mocha测试是“同步的”是模棱两可的。这可能意味着:
两者不相等。一个并不意味着另一个。默认情况下,Mocha会同步处理所有测试。我们可以使它异步处理测试,但可以向传递给it它的回调添加参数(或在其他测试接口中等效的参数)。(后来的Mocha版本最终添加了另一种方式使Mocha异步处理测试:返回Promise。但是在以下示例中,我将使用回调。)因此,我们可以有4种同步性组合:
it
it("reads foo", function () { fs.readFileSync("foo"); // ssert what we want to assert.
});
没问题。
it("reads foo", function (done) { fs.readFileSync("foo"); // Assert what we want to assert. done();
Mocha测试是异步的没有意义,但是没有问题。
it("reads foo", function (done) { fs.readFile("foo", function () { // Assert what we want to assert. done(); });
it("reads foo", function () { fs.readFile("foo", function () { // Assert what we want to assert. });
这是个问题。Mocha会立即从测试回调中返回并称其为成功(假设fs.readFile不会引发异常)。异步操作仍将被调度,并且回调仍可在以后调用。这里重要的一点是:Mocha没有权力使其测试的操作同步。因此,使 Mocha测试 同步不会影响测试中的 操作 。如果它们是异步的,则无论我们如何告诉Mocha,它们都将保持异步。
fs.readFile
在您的系统中,最后一种情况将导致存储过程的执行与数据库系统一起排队。如果此队列无误发生,则摩卡立即结束。然后,如果有文件更改,则观察者将启动另一个Mocha运行,并将更多操作排队,等等。