0

好的,所以我有所有这些依赖于 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

这绝对拒绝发出“结束”事件并结束测试......

这真的让我发疯,任何人都可以看到这里有什么问题吗?或者是什么可能使这不起作用?

仅供参考,当我在运行 testFunc 之前将响应对象记录到控制台时,我可以看到完成:false并且当我在看到之后记录它时

EventEmitter {
  _headers: { 'content-type': 'application/json' },
  cookies: {},
  finished: true,
  headersSent: true,
  statusCode: 200,
  ....etc.

完成了:真的那么为什么不发出“结束”事件?

4

1 回答 1

1

好的,我很确定我想通了……就像我不知道 8 小时的争论一样,在这个简单实验的每个阶段都在低级别检查响应对象事件发射器。你必须像这样连接事件发射器

response.on('end', () => {

});

test.test(request, response);

在你调用你的路由函数之前......有点不对,但是,嘿,也许这会为某人省去痛苦。

在调用路由/函数之前,您必须放置 response.on('end', () => ...

jeeze 我希望他们的文档能够澄清这个要求,显然他们在他们的例子中展示了它,但他们没有澄清它的必要性。

但是我猜想在专家级别上了解 js 的人已经知道有关 EventEmmiters 的这种东西。

...回想起来似乎很明显,但是因为我的代码正在工作(仍在工作)并且它向后连接,所以它就不那么明显了。即使我在连接事件发射器之前调用测试路由/控制器在任何地方都完全倒退了,但这在我的应用程序中一直为我工作的唯一原因是因为运气不好,我所有的路由只花了几毫秒的时间足够长直到事件处理程序有机会连接之后才发出事件......所以当我开始将所有内容转换为同步和更多单元测试时,它突然停止工作。

希望将来会带来一些好处。

于 2019-03-06T07:50:07.473 回答