我正在尝试写单元测试的fastify应用程序,其中也有自定义的fastify插件。有没有办法模拟fastify插件?我尝试使用Jest和Sinon进行模仿,但没有太多成功。
发布于 2021-08-23 09:30:12
到文件的链接被破坏,主分支中现在没有mocks Giorgios文件夹。我在他回答的时候挖掘了提交历史记录,发现了一个文件夹仍然在那里的commit。我把它留在这里给将来要来的人!
发布于 2020-10-07 03:08:05
发布于 2021-10-26 18:08:45
你没有给出一个具体的用例,你可能有很多理由想要模拟一个插件。因为我不知道具体的信息,所以我将展示如何模拟一个插件,该插件创建一个装饰器,该装饰器存储可以用Fastify.decator-name检索的数据。这是连接到数据库或存储其他广泛需要的变量的插件的常见用例。
在下面的例子中,我们的目标是测试一个查询数据库的查询函数;一个插件通过fastify装饰器存储连接信息。因此,为了对查询进行单元测试,我们特别需要模拟连接的客户端数据。
首先创建一个fastify实例。接下来,设置一个mock来返回所需的伪响应。然后,不是用fastify注册组件(您也可以这样做),而是直接用模拟信息修饰所需的变量。
下面是要测试的函数。我们需要为一个数据库模拟一个插件,该插件创建一个名为db的fastify装饰器。
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");
});
});https://stackoverflow.com/questions/59965807
复制相似问题