我正在尝试使用 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”中设置延迟,我可以以一种孤立的方式重现它。