0

我正在尝试使用 http-mocks 进行一些测试并表达异步代码。但它失败了,我认为存在某种竞争条件。这个问题并不总是发生,这很奇怪,但总的来说,如果我在文件中有多个异步测试,就会发生这种情况。

我有这样的东西(简化版):

const httpMocks = require('node-mocks-http');
beforeEach( function() {
    mockResponse = httpMocks.createResponse({
        eventEmitter: require('events').EventEmitter,
    });
    // ...
});
describe("some test group", () => {
    it("some test", async () => {
        const mockRequest = httpMocks.createRequest({method: 'POST', url: '/', query: { // ...
        } });
        const commandRouter = command( /*  ... some mocks */);
        await commandRouter(mockRequest, mockResponse);
        console.log("point 2");
        // assert
        expect(mockResponse.statusCode).to.equal(200);
        expect(mockResponse._getData()).to.equal('ok');
        expect(mockResponse._isEndCalled()).to.be.true;
        // more assertions
    });    
    // more similar tests
});

和实际的代码:

const express = require('express');

module.exports = function(/* params */) {
  const router = express.Router();
  async fun1() {
     ...
  }  
  router.post('/', async(req, res, next) => {
    await fun1();

    res.write('ok');
    res.end();
    console.log("point 1");
    next();
  });
  return router;
};

这应该会通过,但是:

      AssertionError: expected '' to equal 'ok'
      + expected - actual

      +ok

所以我认为测试运行在res.write('ok')发生之前就结束了。

为什么会发生这种情况?http-mocks 不是面向测试异步代码吗?实际上我所有的断言都失败了,但是错误代码 200 一个,它不会因为它是默认返回值而失败。

在我得到的印刷品中:

point 2
point 1

与我预期的相反。所以测试绝对不是等待异步代码运行。我怎样才能解决这个问题?

使用的版本:

节点:v12.13

“节点模拟-http”:“^1.10.1”,

“快递”:“^4.17.1”,

"柴": "^4.3.4",

"摩卡": "^8.4.0",

“诗乃”:“^10.0.0”

例如,如果我在“fun1”中设置延迟,我可以以一种孤立的方式重现它。

4

0 回答 0