javascript - 如何在 Mocha 中执行测试之前强制 before() 完成?

标签 javascript mocha.js chai

我是 JavaScript 生态系统的新手。我正在尝试使用 Mocha/Chai 为我的 REST API 编写几个 API 测试。我的要求是我必须在运行每个测试用例之前清理数据库。因此,我在名为 dbCleanup.js

的文件中编写了以下代码
var config = require("config.json");
const pg = require('pg');

var connectionString = config.pgConnectionString
console.log("DB Connection String: ", connectionString)

function dbCleanup() {

    var dbTables = ["projects", "employees"];

    var pgClient = new pg.Client(connectionString);

    var promise = new Promise(function (resolve, reject) {
        pg.connect(connectionString, (err, pgClient, done) => {
            if (err) {
                done();
                console.log(err);
                reject();
            }

            for (i = 0; i < dbTables.length; i++) {
                query = "TRUNCATE " + dbTables[i] + " CASCADE;"
                pgClient.query(query, function (err, res) {
                    if (err) {
                        done();
                        console.error('error running query', err);
                        reject();
                    }
                    resolve();
                });
            }
        });
    });

    pgClient.end()

    return promise;
}

exports.dbCleanup = dbCleanup;

我有另一个名为 globalBefore.js 的文件,其中包含以下代码:

var dbCleanup = require('./dbCleanup.js').dbCleanup;

function _beforeClean(done) {
    try {
        dbCleanup()
            .then(done)
    } catch (err) {
        console.error(err);
    }
}

exports.beforeCleanup = _beforeClean;

现在在我的 Mocha test.js 文件中,我尝试调用数据库清理函数,如下所示:

var request = require("request");
var rp = require("request-promise");
var config = require("../config.json");
var expect = require('chai').expect;
var data = require("./data.json");

var globalBefore = require("../globalBefore.js");


describe("POST /employees/", function () {

    console.log("clearing db tables...")
    before(globalBefore.beforeCleanup, function (done) {
        done();
    });

    beforeEach(function (done) {
    ... do some business logic related work here ...
    });


    it.only('Try create an employee', function (done) {
    ... API call to create an employee and use Chai assertions to validate ...
    });
});

我面临的问题是,Mocha 甚至在 dbCleanup() 函数完成之前就继续运行我的测试。这会导致我的数据库崩溃,并且我遇到了不良行为。

SO 社区的任何人都可以帮忙吗?我尝试了在网上可以找到的各种选项,但无法解决问题。如代码片段所示,我希望使用 Promise 应该可以解决问题

更通用的是,如何强制执行 before 子句中的指令,以便在 Mocha 运行 it 子句进行测试之前完成?

谢谢!

最佳答案

您使用before的方式是错误的。试试这个:

before(function (done) {
    globalBefore.beforeCleanup(done);
});

before(globalBefore.beforeCleanup);

globalBefore.js中:

var dbCleanup = require('./dbCleanup.js').dbCleanup;

function _beforeClean(done) {
    dbCleanup().then(done).catch(done);
}

exports.beforeCleanup = _beforeClean;

示例(我仅更改了 dbCleanup.js 以使用另一个 promise )

dbCleanup.js

function dbCleanup() {

    return new Promise(function (resolve, reject) {
        setTimeout(resolve, 2000);
    });

}

exports.dbCleanup = dbCleanup;

globalBefore.js

var dbCleanup = require('./dbCleanup.js').dbCleanup;

function _beforeClean(done) {
    dbCleanup().then(done).catch(done);
}

exports.beforeCleanup = _beforeClean;

index.js

var globalBefore = require("../globalBefore.js");

describe("POST /employees/", function () {

    this.timeout(5000); // because the promise take 2000ms

    console.log("clearing db tables...")
    before(function (done) {
        console.log('before calling beforeCleanup');
        globalBefore.beforeCleanup(function () {
            console.log('after calling beforeCleanup');
            done(); // done cleaning db
        });
    });

    /* Without the console.logs
    console.log("clearing db tables...");
    before(globalBefore.beforeCleanup)
    */

    beforeEach(function (done) {
        // ... do some business logic related work here ...
        console.log('beforeEach');
        done();
    });


    it.only('Try create an employee', function (done) {
        // ... API call to create an employee and use Chai assertions to validate ...
        console.log('it');
        done();
    });
});

输出

clearing db tables...

  POST /employees/
before calling beforeCleanup
after calling beforeCleanup
beforeEach
it
    √ Try create an employee


  1 passing (2s)

https://mochajs.org/#hooks

关于javascript - 如何在 Mocha 中执行测试之前强制 before() 完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44469582/

相关文章:

php - 如何打开新窗口/选项卡并动态填充内容?

javascript - 如何防止 Mocha 捕获未处理的异常?

javascript - Chai:断言数组包括所有项目

node.js - 如何使用 mocha 和 chi 检查 Node js 中的 Rabbit 连接以进行单元测试

javascript - 使用Raphael js直接在google maps上绘制

javascript - Bootstrap模态ajax表单提交多次

typescript - ts2339 : property 'should' does not exist on type Bluebird<boolean>

javascript - 如何 stub 未直接传递给调用函数的函数?

chai - 如何使用chai检查元素是否存在?

javascript - 状态变异中的 React 数组