Jest.js 如何使用无服务器离线和Supertest从集成测试中获取代码覆盖率指标?

5gfr0r5j  于 2022-12-20  发布在  Jest
关注(0)|答案(1)|浏览(150)
    • 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谢谢!

bzzcjhmw

bzzcjhmw1#

这里有一个例子,希望能有所帮助。

const jest = require('jest');
const supertest = require('supertest');
const serverlessOffline = require('serverless-offline');

// Create a jest test
describe('My Test', () => {
  // Initialize the server
  beforeAll(async () => {
    await serverlessOffline.start();
  });

  // Close the server after the test is complete
  afterAll(async () => {
    await serverlessOffline.stop();
  });

  // Create the test
  it('should return the right code coverage metrics', async () => {
    const response = await supertest(serverlessOffline.handler)
      .get('/my-endpoint');

    expect(response.statusCode).toBe(200);
  });
});

// Run Jest
jest.run();

相关问题