簡體   English   中英

Jest - 嘗試使用 new 關鍵字模擬在 function 中創建的數據庫連接

[英]Jest - trying to mock db connection that is created in a function using new keyword

我有以下從 mssql 中獲取數據的代碼。 有什么辦法可以模擬連接池嗎? 我想讓 pool.request().execute() 調用返回一些模擬數據。 我不認為這是可能的,我目前正在努力思考如何測試這個 function。

我能想到的唯一解決方案是將 ioc 用於連接池。 但在我提前 go 之前,我只想確保不可能模擬連接池。

謝謝

const fetchData ({args}) => {
  const pool = await new ConnectionPool(conn.getConfig()).connect();
  const result = await pool.request().input(...args).execute('Get_Some_Data');
  pool.close();
  
  // business logic below I want to test
  ...
  ...
}

我一直在谷歌搜索並檢查文檔。 我不認為這是可能的,但我想確認一下。

您可以使用 `jest.fn().mockImplementation() 模擬構造函數。 文檔中閱讀更多相關信息。

const mockPool = {
    connect: () => mockPool,
    request: () => mockPool,
    input: () => mockPool,
    execute: () => {
        console.log("Called mock execute");
        return [1, 2, 3];
    },
    close: () => console.log("Closed")
}

const ConnectionPool = jest.fn().mockImplementation(() => mockPool)

例子

我假設您正在使用來自mssql package 的ConnectionPool

源代碼

const {ConnectionPool} = require("mssql");

const fetchData = async ({args}) => {
    const pool = await new ConnectionPool(conn.getConfig()).connect();
    const result = await pool.request().input(...args).execute('Get_Some_Data');
    pool.close();
    
    // business logic
    return result;
}

測試腳本

const {fetchData} = require('./fetch-data');

jest.mock('mssql', ()=> {
    const mockPool = {
        connect: () => mockPool,
        request: () => mockPool,
        input: () => mockPool,
        execute: () => {
            console.log("Called mock execute");
            return [1, 2, 3];
        },
        close: () => console.log("Closed")
    }

    return {
        ConnectionPool: jest.fn().mockImplementation(() => mockPool)
    }
});


it('Mock Connection Pool', async () => {
    const data = await fetchData({args: []});
    expect(data).toStrictEqual([1, 2, 3]);
});

謝謝!

暫無
暫無

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

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