簡體   English   中英

在打字稿中用 Jest + Supertest 模擬

[英]Mocking with Jest + Supertest in Typescript

我正在用打字稿中的 jest 編寫模擬測試用例並嘗試使用 supertest 模擬 API 調用,但無法獲得模擬響應作為回報,因為我在登錄功能上使用 Axios 甚至嘗試模擬 Axios 調用但得到了沒運氣。

這是我的代碼:

auth.controller.ts

import { AxiosService } from "helpers";

export class AuthController {
    constructor() {
       ...
      // Some logic is written here
      this.init()
    }

    public init() {
       // prepared an route for login
       router.post('/api/auth/login', this.login);
    }
  
    login = async function (req: Request, res: Response): Promise<void> {
        // Preparing config for axios call with some logic
        ...

        // created a service for Axios call to some third party.
        AxiosService.call(req, res, config, "login");
    }
  }
    
    

auth.test.ts

import { AuthController } from "../../modules/auth/auth.controller";
jest.mock("../../modules/auth/auth.controller");

beforeAll(async () => {
  const auth = new AuthController();
  mockLogin = jest.spyOn(auth, "login");
});

afterAll(async () => {
  server.stop();
});

test("should give login response", async () => {
    mockLogin.mockImplementation(() => {
      return Promise.resolve({ Success: true, body: "Login" });
    });

      const response = await request(server.app)
        .post("/api/auth/login")
        .send(requestBody)
        .expect(200);

      response.body // Getting the server response instead of mocked one
})
    
    

也嘗試過此代碼,但那里沒有運氣:

jest.mock('../../modules/auth/auth.controller', () => {
  return { 
    AuthController: jest.fn().mockImplementation(() => {
          return {
              login: jest.fn()
          }   
      })
  }
})
            
    

這是我的AxiosService類:

export class AxiosService {

  public static async call(...):Promise<void> { 
    try { 
       const { data } = await axios(...);

       res.status(200).json(data);
    } catch(err) {
       res.status(400).send(err);
     }
  
  }

}

嘗試使用以下行模擬AxiosService調用方法:

jest.mock('../../helpers/AxiosService', () => {
  return jest.fn().mockImplementation(() => {
    return { call: () => { return {success:true, data:'mock'}} }
  })
})

但是,在模擬 Axios 調用之后,我發現在jest.setTimeout 指定的 10000(我給出的)毫秒超時內沒有調用異步回調

任何人都可以提供幫助,這對我來說會很棒,因為我是嘲笑概念的新手,所以也許我在這里遺漏了一些東西。

提前致謝

一種正確的測試策略,除了測試過的每個單元都需要模擬。

超時發生是因為 Supertest 等待服務器響應,並且在AxiosService情況下沒有,因此需要AxiosService如下:

...
return { call: (req, res) => { res.status(200).json({success:true, data:'mock'}); }

在這種情況下,測試可以使用模擬服務類模擬控制器類,或者與模擬 Axios 一起測試它們。 由於 AuthController 並沒有單獨做很多事情(AuthController 和 AxiosService 是對簡單 Express 處理程序的抽象),它可以是:

jest.mock('axios', () => jest.fn()) // at top level
...
axios.mockResolvedValue({ data: ... });
const response = await request(server.app)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM