gpt4 book ai didi

javascript - Mocha js 调用 After() 太快了吗?

转载 作者:行者123 更新时间:2023-12-05 05:25:24 24 4
gpt4 key购买 nike

Mocha 单元测试的新手,我有几个运行良好的 Mocha 示例,但我已经尝试了几个小时才能让这个运行,无论我做什么,after() 的调用都比我感觉的要早这应该。这是一个例子:

var dummyData = require('./dummyData.js')

describe('mochaTest', function() {

after(function(done) {
dummyData.cleanDb(function(){
done();
})
});

it('should hit the db to get dummy data and send', function(done) {

dummyData.createDummyData(function(data1, data2, Lookup) {
Lookup.lookup({
data1: data1,
data2: data2
}, function(err, result) {
done();
});
});
});
})

然后在 dummyData.js 中:

exports.createDummyData = function(cb){
doSomeStuff(function (err, patient) {
// Connect to db, get some data to pass.
var Lookup = require(./Lookup.js);
cb(data1, data2, Lookup);

})
}

exports.cleanDb = function(cb) {
// Clear db connections.
cb();
}

问题是在测试运行后,after() 函数被调用并且 Lookup 函数无法访问数据库,因为数据库连接已被清除。为什么这么早被调用,直到it语句调用done()才正确调用它?

最佳答案

这是一个老问题,但我遇到过同样的问题,找不到任何解释来解决这个问题。不幸的是,我没有足够的声誉来回答评论,所以我将在这里分享我是如何解决我的问题的。

在我的 Controller 中,我有一个概述如下的方法:

exports.insert = (request, response) => {
UserModel.createUser(request.body)
.then(() => {
respond.status(201).send({message: 'User created successfully
});
};

我意识到这里的问题是我的测试方法没有等待我的 User.insert() 的响应,因为这个函数是无效的——它不返回值。因此下面的测试将直接跳转到调用 done();,因为没有理由等待 User.insert() 的响应。这导致我的 after hook 过早运行并在我的 UserModel 可以填充之前关闭与我的数据库的连接。

// Code is shortened, but my request and response was formed using node-mocks-http package

it('should return status 201', function (done) {
User.insert(request, response);
assert(response._getStatusCode() === 201);

done();
};

我不想说我花了多长时间才意识到这一点。但是,我需要从我的 Controller 返回一个 promise ,这样我的测试函数才会有等待的东西。通过将我的 Controller 更改为此:

exports.insert = async (request, response) => {
await UserModel.createUser(request.body)
.then(() => {
response.status(201).send({message: "User created successfully"});
})
.catch(() => {
response.status(400).send({message: "There is already an account with that email"});
});

return response;

我的测试看起来像这样:

it('should return a status code of 201', async function () {
await User.insert(request, response);
assert(response._getStatusCode() === 201);
});

数据库成功填充,我的测试将等待我的 promise 实现,从而在调用我的断言之前更新响应。然后 after 钩子(Hook)按预期工作。

我希望这对偶然发现这个旧线程的其他人有所帮助。

关于javascript - Mocha js 调用 After() 太快了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31281328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com