我正在尝试为也有自定义 fastify 插件的 fastify 应用程序编写单元测试。有没有办法模拟 fastify 插件?我尝试使用 Jest 和 Sinon 进行模拟,但没有取得多大成功。
问问题
1141 次
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 回答