- bounty将在3天后过期**。回答此问题可获得+500声望奖励。Bruno Peres希望引起更多人关注此问题。
我正在构建一个AWS Lambda函数,并尝试为它编写一些集成测试。Lambda函数使用serverless-offline plugin在本地运行,只接收带有一些查询参数的GET请求。我使用Jest和Supertest编写集成测试,如下所示:
import request from 'supertest';
describe('User position handler', () => {
it('should return history', () => {
const server = request('http://0.0.0.0:4000');
return server
.get(`/local/position?type=month&period=3`)
.expect(200)
.expect((response) => {
console.log('RESPONSE', response);
expect(response.body).toHaveLength(3);
});
});
});
问题是当我运行带有collect coverage选项的Jest时,通过Supertest发送的请求所到达的代码并没有在指标中计算出来。
问题是,我知道,例如,infra/handlers/user-position.ts
正在被访问,并且覆盖了超过0%的语句,但是覆盖率指标没有按预期显示。我知道user-monthly-position.service.impl.ts
会在流的某个点到达,因为此服务负责从外部服务返回数据,而Supertest的响应正在返回数据。绿线来自单元测试所覆盖的文件,这些文件只使用了Jest(显然,没有使用Supertest)
我知道在使用Supertest和Express框架时,我可以将Express应用的示例传递给request
函数。这样,我认为Jest可以"检查"或"检测"函数调用堆栈以测量覆盖率(下面的代码示例)。但如何传递正在运行的serverless-offline
Lambda的URL呢?
const request = require('supertest');
const assert = require('assert');
const express = require('express');
const app = express();
app.get('/user', function(req, res) {
res.status(200).json({ name: 'john' });
});
request(app)
.get('/user')
.expect('Content-Type', /json/)
.expect('Content-Length', '15')
.expect(200)
.end(function(err, res) {
if (err) throw err;
});
下面是我的处理函数的代码:
export default async (event: APIGatewayEvent): Promise<APIGatewayProxyResult> => {
await cacheService.bootstrapCache();
const userMonthlyPositionService = new UserMonthlyPositionServiceImpl(
cacheService.connectionPool,
);
const getUserMonthlyPositionHistory = new GetUserMonthlyPositionHistory(
userMonthlyPositionService,
);
const result = await getUserMonthlyPositionHistory.execute({
cblc: 999999,
period: 3,
type: 'month',
});
return buildResponse(200, result);
};
我的问题是:我如何使用Supertest和Serverless Framework从Jest中收集正确的代码覆盖度量?2我忘记了一个细节吗?3谢谢!
1条答案
按热度按时间bzzcjhmw1#
这里有一个例子,希望能有所帮助。