好的,所以我有所有这些依赖于mocha中的node-mocks-http的测试来测试我的express.js控制器,并且它们仍然可以正常工作。
问题是我创建的任何新测试都拒绝发出“结束”事件并结束。到了我决定编写一个非常简单的控制器功能并在一个全新的项目中进行测试的时刻,我仍然没有触发“结束”事件。
这是我的控制器(index.js):
exports.testFunc = function(req, res) {
res.status(200).json({
status: 'success',
status_message: 'OK',
data: {
firstRun: true
}
});
}
这是我的测试(test.js):
let httpMocks = require('node-mocks-http');
let request = httpMocks.createRequest({
method: 'GET',
url: '/test',
});
let response = httpMocks.createResponse({
eventEmitter: require('events').EventEmitter
});
const loadingController = require('./index');
describe('loadingController:', () => {
describe('first_run_status: ', () => {
it('should really respond here', (done) => {
loadingController.testFunc(request, response);
response.on('end', () => {
done();
});
});
});
});
这是我运行时使用的确切代码
./node_modules/mocha/bin/_mocha ./test.js --timeout 10000 --exit
这绝对拒绝发出'end'事件并结束测试...
这真的使我发疯,任何人都可以看到这里出了什么问题吗?还是有什么可能使它不起作用?
仅供参考,当我在运行testFunc之前将响应对象登录到控制台时,我可以看到 finished:false ,当我看到它之后又可以登录
EventEmitter {
_headers: { 'content-type': 'application/json' },
cookies: {},
finished: true,
headersSent: true,
statusCode: 200,
....etc.
完成了:是,那么为什么不会发出“结束”事件?
答案 0 :(得分:0)
好吧,很确定我已经解决了这个问题,就像我不知道8个小时的争吵,然后在这个简单实验的每个阶段都认真研究响应对象事件发射器一样。您必须像这样连接事件发射器
response.on('end', () => {
});
test.test(request, response);
在调用route函数之前……有点不对劲,但是,嘿,也许这可以减轻某人的痛苦。
在调用路由/函数之前,您必须将响应放在('end',()=> ......
jeeze我希望他们的文档能澄清这个要求,很显然他们在示例中展示了它,但是他们没有阐明它的必要性。
但是我想以专业水平理解js的人已经知道有关EventEmmiters的这类知识。
回想起来,...似乎很明显,但是由于我的代码向后连接(正在工作)(仍在工作),因此不那么明显。即使我在挂接事件发射器之前通过调用测试路径/控制器完全向后进行此操作,这对我的应用程序中的每个地方都起作用,这是唯一的原因,因为运气不好,我所有的路径仅花费了毫秒的时间,直到事件处理程序有机会挂上钩子后,事件才发出。因此,当我开始将所有内容都转换为同步状态并且进行更多单元测试时,它突然停止工作。
希望这会带来一些好处。