[英]Testing REST API in Express NodeJS
我需要在 NodeJS/Express 中開發 mocking REST API。 我已經在使用 Jest 並嘗試使用 Supertest / Nock 進行 API 測試。 據我了解,Supertest 將調用實際的 API 而不僅僅是模擬它。 我不想要這個,因為它會在數據庫等中創建條目。
我嘗試使用 Nock 並且似乎是我需要的,但問題是我在路由處理程序中引用“req”和“res”對象,在測試期間單獨調用處理程序時這是未定義的。
代碼:server.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);
}
測試.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")
});
});
問題:我應該如何測試這段代碼,通過 mocking backendServerUrl?
所以我會放棄,因為你可以用axios
nock
jest
你已經在使用它了,不需要導入另一個模塊。
從頭開始.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
}
從頭開始測試.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
返回一個 promise 所以我們將使用mockResolvedValue
而不是mockReturnedValue
,我們只想模擬get
,這就是我們要針對的斷言。
這里有一些對未來有用的資源: https://jestjs.io/docs/en/mock-functions.html httpsect://jestjsexpio。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.