Тестирование REST API в Express NodeJS - PullRequest
0 голосов
/ 08 апреля 2020

Мне нужно издеваться над API REST, разработанным в NodeJS / Express. Я уже использую Jest и попробовал использовать Supertest / Nock для тестирования API. Насколько я понимаю, Supertest будет вызывать реальный API, а не просто издеваться над ним. Я не хочу, чтобы это создавало записи в БД и т. Д. c.

Я попытался использовать Nock, и мне кажется, что это то, что мне нужно, но проблема в том, что я ссылаюсь на объекты "req" и "res" в обработчике маршрута, который становится неопределенным при вызове одних только обработчиков во время тестирования .

Код: сервер. js

app.get("/api/user/:id/movies",testHander)

testHander. js

const axios = require("axios");

const testHander = async (req,res) =>{
    let id = req.params.id;
    const data = await axios.get(`http://backendServerURL/user/${id}/movies`)
    return res.send(data);
}

testing.test. js

const nock = require("nock");
const testHander = require("../handler/testHander");

describe("Test Handler", () => {
  it("should return user movies", () => {
    const id = 1;

    nock("http://someRandomURL")
      .get(`/user/${id}/movies`)
      .reply(200, { data: { movies: [{ name: "Avengers", year: "2019" }] } });

    const response = await testHander();

    expect(response.data).toBe("someExpectation")
  });
});

Вопрос: Как мне проверить этот код, издеваясь над backendServerUrl?

1 Ответ

0 голосов
/ 08 апреля 2020

, поэтому я бы отбросил nock, так как вы можете смоделировать axios с помощью jest, и похоже, что вы уже используете это, нет необходимости импортировать другой модуль.

scratch. js

const axios = require('axios')

module.exports.handler = async (req, _) => {
    const { id } = req.params
    const data = await axios.get(`http://backendServerURL/user/${id}/movies`)

    return data
}

scratch.test. js

jest.mock('axios')

const axios = require('axios')
const { handler } = require('../scratch')

it('should return mock movie data from axios get request', async () => {
    const id = 8238010
    const mockMovie = { data: { movies: [{ name: 'Avengers', year: '2019' }] } }
    const mockRequest = { params: { id } }

    axios.get.mockResolvedValue(mockMovie)

    const response = await handler(mockRequest)

    expect(axios.get).toHaveBeenCalledTimes(1)
    expect(axios.get).toHaveBeenCalledWith(`http://backendServerURL/user/${id}/movies`)
    expect(response).toEqual(mockMovie)
})

axios возвращает обещание, поэтому мы будем использовать mockResolvedValue сверх mockReturnedValue, и мы хотим смоделировать только get, и это то, против чего мы собираемся сделать наши утверждения.

Вот некоторые полезные ресурсы для будущее: https://jestjs.io/docs/en/mock-functions.html https://jestjs.io/docs/en/expect

...