【问题标题】:Testing REST API in Express NodeJS在 Express NodeJS 中测试 REST API
【发布时间】:2020-07-20 09:32:30
【问题描述】:

我需要模拟在 NodeJS / Express 中开发的 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);
}

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 来测试这段代码?

【问题讨论】:

    标签: node.js unit-testing express jestjs


    【解决方案1】:

    所以我会放弃nock,因为您可以用jest 模拟axios,看起来您已经在使用它,无需导入另一个模块。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2016-09-20
      • 2015-03-03
      • 2019-04-05
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多