我正在使用在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()并检查我的测试状态,但这将成为维护的噩梦。
答案 0 :(得分:12)
您正在运行在同步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运行并且更多操作排队等等。