0

我正在尝试为也有自定义 fastify 插件的 fastify 应用程序编写单元测试。有没有办法模拟 fastify 插件?我尝试使用 Jest 和 Sinon 进行模拟,但没有取得多大成功。

4

3 回答 3

1

指向该文件的 Giorgios 链接已损坏,主分支中现在不存在mocks文件夹。我在他回答的时候挖掘了提交历史,我发现了一个文件夹仍然存在的提交。我把它留在这里给那些将来会来的人!

于 2021-08-23T09:30:11.900 回答
0

您没有给出特定的用例,并且有很多原因可能想要模拟插件。要模拟的插件的性质对于给出一个好的答案很重要。因为我不知道具体信息,所以我将展示如何模拟一个插件,该插件创建一个装饰器,该装饰器存储可以使用 fastify.decorator-name 检索的数据。这是连接到数据库或存储其他广泛需要的变量的插件的常见用例。

在下面的例子中,目标是测试一个查询数据库的查询函数;插件通过 fastify 装饰器存储连接信息。因此,为了对查询进行单元测试,我们特别需要模拟连接的客户端数据。

首先创建一个 fastify 的实例。接下来,设置一个模拟以返回所需的虚假响应。然后,无需使用 fastify 注册组件(您也可以这样做),只需使用模拟信息直接装饰所需的变量。

这是要测试的功能。我们需要模拟一个数据库插件,它创建一个名为 db 的 fastify 装饰器。具体来说,在以下情况下,要测试的函数使用 db.client:

const fastify = require("fastify")({ //this is here to gather logs
    logger: {
        level: "debug",
        file: "./logs/combined.log"
    }
});


const HOURS_FROM_LOADDATE = "12";     

const allDataQuery = `
SELECT * 
FROM todo_items 
WHERE a."LOAD_DATE" > current_date - interval $1 hour
`;
const queryAll = async (db) => {
    return await sendQuery(db, allDataQuery, [HOURS_FROM_LOADDATE]);
};


//send query to db and receive data
const sendQuery = async (db, query, queryParams) => {
    var res = {};
    try {
        const todo_items = await db.client.any(query, queryParams);
        res = todo_items;
    } catch (e) {
        fastify.log.error(e);
    }
    return res;
};

module.exports = {
    queryByAsv
};

以下是测试用例。我们将从 db 插件模拟 db.client:

 const { queryAll } = require("../src/query");
    
    const any = {
        any: jest.fn(() => {
            return "mock response";
        })
    };
    
    describe("should return db query", () => {
        beforeAll(async () => {
            // set up fastify for test instance      
            fastify_test = require("fastify")({
                logger: {
                    level: "debug",
                    file: "./logs/combined.log",
                    prettyPrint: true
                }
            });
    
    
            
        });

        test("test Query All", async () => {
            // mock client
            const clientPromise = {
                client: any
            };
            //
            fastify_test.decorate("db", clientPromise);
            const qAll = await queryAll(fastify_test.db);
            expect(qAll).toEqual("mock response");
        });
        
    
    
    
    
    
        
    });
于 2021-10-26T18:08:44.780 回答
0

你的问题有点笼统,但如果你使用的是 Jest,它必须足以模拟一个 fastify 插件。您可以查看这个repo,更具体地说是这个文件。这是一个 fastify 的模拟文件,你添加注册的插件,在具体的例子中addCustomHealthCheck,然后在你的测试文件中你可以调用jest.mock('fastify').

于 2020-10-06T19:08:05.250 回答