使用Jest测试Redis功能



我有以下文件连接到redis数据库:index.js

const redis = require('redis');
const logger = require('../logger');
const config = require('../env');
const client = redis.createClient({
host: config.redis.host,
port: config.redis.port
});
const connect = () => {
client.on('connect', () => {
logger.info(`Redis connected on port: ${client?.options?.port}`);
});
client.on('error', err => {
logger.error(`500 - Could not connect to Redis: ${err}`);
});
};
const close = () => {
client.quit();
};
module.exports = { connect, close, client };

以及一个包含一些Redis功能的帮助文件:

const util = require('util');
const { client } = require('./index.js');
const set = ({ key, data, mode, expiresIn }) => {
client.set(key, data, mode, expiresIn);
};
const get = key => {
client.get = util.promisify(client.get);
return client.get(key);
};
const remove = key => {
client.del(key);
};
const getKeys = keyPattern => {
client.keys = util.promisify(client.keys);
return client.keys(keyPattern);
};
module.exports = { set, get, remove, getKeys };

现在我想用Jest测试这些功能,我应该模拟mocks文件夹中的Redis吗?或者只是为测试环境创建一个单独的数据库来测试功能?

我认为这可能是一个主观问题。首先,这取决于你想进行什么类型的测试。如果是单元测试,我会考虑嘲笑Redis服务。一些开发人员将单元测试视为方法或函数级别,即方法是要测试的单元。但单位是什么也可能是主观的。公开有限公共方法的服务类也可以被视为单元。如果您正在运行集成测试,我强烈考虑使用实际的redis实例。在以前的角色中,我们使用docker-compose来启动所有服务依赖项以运行本地集成,但这同样取决于依赖项的复杂性。在我目前的职位上,集成测试是针对mock进行的。这是一个会得到主观答案的问题。

正如jeeves所说,我同意它的主观性。我正在为我的redis服务编写Jest测试,但从操作开始——所以我检查我的操作是否从模拟redis中获取和设置。

明确地说,在上面的代码中,几乎没有逻辑发生,所以我建议不需要测试——否则你就很接近于测试promisify/redis本身是否有效,我们需要假设他们的代码是可以的。

最新更新