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

 凌晨丶 发布于 2023-02-08 14:01

我正在使用在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()并检查我的测试状态,但这成为维护的噩梦.

1 个回答
  • 您正在运行在同步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运行,并且更多操作将排队等.

    2023-02-08 14:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有