我正在使用在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测试中异步的操作.
说摩卡测试是"同步"是模棱两可的.这可能意味着:
测试测试的操作同步进行.
Mocha以同步方式处理测试.
这两者并不相同.一个不需要另一个.默认情况下,Mocha同步处理所有测试.我们可以让它异步处理测试,但是为我们传递给it
它的回调(或者在其他测试接口中的等价物)添加一个参数.(后来版本的Mocha最终添加了另一种让Mocha异步处理测试的方法:返回一个promise.但是我将使用回调来表示以下示例.)所以我们可以有4种同步组合:
操作同步,摩卡测试同步.
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运行,并且更多操作将排队等.