【发布时间】:2023-04-09 21:39:01
【问题描述】:
我正在尝试编写一个单元/集成测试,我想在其中获取数据库中的事物列表。不是它只是一个 GET,而是这些测试需要扩展到 POST、PUT 和 DELETE。
到目前为止,我的代码运行良好,我实际上可以从数据库中获取数据,但是一旦我尝试删除负责调用数据库的函数,Mocha 就会超时
1 次失败
1) /account_types GET 200 列表: 错误:超过 2000 毫秒的超时。确保在此测试中调用了 done() 回调。 在空。 (C:\Code\JS\general_admin_service\node_modules\mocha\lib\runnable.js:215:19)
我知道 done() 回调没有被调用,因为代码卡在某个地方,但是,我不明白我做错了什么。
我使用以下参考资料来了解我的位置:
我的代码如下:
测试:
'use strict';
var expect = require('chai').expect,
request = require('supertest'),
chance = require('chance').Chance(),
server = require('../server'),
sinon = require('sinon'),
select = require('../../helpers/data_access/select');
describe("/account_types", function () {
before(function(done){
sinon
.stub(select, "query_list")
.returns([{id: "test"}]);
done();
});
after(function(done){
select
.query_list
.restore();
done();
});
it('GET 200 List', function (done) {
request(server.baseURL)
.get('/api/v1/account_types')
.set('Accept', 'application/json')
.expect('Content-Type', 'application/json')
.expect(200)
.end(function (err, res) {
/* istanbul ignore if */
if (err)
return done(err);
expect(res.body).to.include.keys('result');
expect(res.body.result).to.not.be.null;
expect(res.body.result).to.not.be.undefined;
expect(res.body.result).to.be.an('Array');
expect(res.body.result.length).to.be.above(0);
//expect(select.query_list).to.have.been.calledOnce;
return done();
});
});
});
重置端点:
var select = require('../helpers/data_access/select')
module.exports = function (server) {
var query = "..."
return select.query_list(res, next, db_config, query);
});
};
select.js:
var sql = require('mssql');
module.exports = {
query_list: function (res, next, config, sql_query) {
return query(res, next, config, sql_query, true);
},
query_single: function (res, next, config, sql_query) {
return query(res, next, config, sql_query, false);
}
};
function query(res, next, config, sql_query, isList) {
var connection = new sql.Connection(config);
connection.connect(function (err) {
if (err) {
return on_error(err, res);
}
var request = new sql.Request(connection);
request.query(sql_query, function (err, response) {
connection.close();
if (err) {
return on_error(err, res);
}
if (isList) {
return return_list(res, response, next);
} else {
return return_single(res, response, next);
}
});
});
}
function on_error(error, res, next) {
res.status(500).send(error);
return next();
}
function return_list(res, response, next) {
res.send({result: response});
return next();
}
function return_single(res, response, next) {
res.send({result: response[0]});
return next();
}
我期望发生的事情是,因为我存根了 query_list 函数,如果我希望在我拥有的期望之后放置一个 console.log(res.body.result);,我应该会看到 [{id: "test"}] 的返回,但显然不是到了那个地步。
我做错了什么?
更新:添加了完整的 select.js 文件。
【问题讨论】:
-
这可能取决于
/api/v1/account_types的处理程序是如何实现的(我想知道Restify 是否因为没有返回响应而卡住了)。 -
据我所知,我没有做任何特别的事情。我基本上遵循了 resitfy 网站上的示例...
-
从你的代码看起来,在
select.query_list的某个地方,响应是发送的(使用res.send()或类似的东西)。由于您正在对该函数进行存根,因此永远不会发送响应,并且 Restify 会无限期地等待(直到 Mocha 超时)。 -
好的,我明白你的意思了。我编辑了我的问题以包含完整的 select.js 文件。
-
好的,所以我有点困惑。我明白你关于
res.send()的观点,但我是否需要将res.send()存根,或者可能将res.send()和next从select.js 中的函数移出到端点?