Node.js 在我的无服务器应用程序上使用Jest进行测试

Node.js 在我的无服务器应用程序上使用Jest进行测试,node.js,amazon-web-services,jestjs,aws-serverless,Node.js,Amazon Web Services,Jestjs,Aws Serverless,我有一个无服务器应用程序,我想对它进行单元测试 我知道Jest有一个无服务器插件,但我现在使用经典的Jest 我在tools.js文件中有这样一个函数 describe('mailExist', async () => { const email = 'example@example.com'; const mailExist = await tools.mailExist(email) it('should not exist', () => {

我有一个无服务器应用程序,我想对它进行单元测试

我知道Jest有一个无服务器插件,但我现在使用经典的Jest

我在tools.js文件中有这样一个函数

describe('mailExist', async () => {
    const email = 'example@example.com';
    const mailExist = await tools.mailExist(email)
    it('should not exist', () => {
        expect(mailExist).toBe({})
    })
});
constddb=require('./ddb');
const table=process.env.USER_table;
...
module.exports.mailExist=异步电子邮件=>{
如果(!电子邮件){
抛出新错误(“缺少参数”);
}
返回等待ddb扫描({
TableName:table,
FilterExpression:'电子邮件=:电子邮件',
表达式属性值:{
“:电子邮件”:电子邮件
},
ProjectionExpression:['uid']
});
};
我想在一个文件中测试它

describe('mailExist', async () => {
    const email = 'example@example.com';
    const mailExist = await tools.mailExist(email)
    it('should not exist', () => {
        expect(mailExist).toBe({})
    })
});
问题是,当我运行测试时,它会返回

参数中缺少必需的键“TableName”

因为我的“table”变量是一个环境变量

如果我写下环境变量的表名,它将返回

配置中缺少区域

所以我的问题是,我想知道如何在特定文件中测试我的无服务器应用程序的功能,以及如何将AWS配置传递给我的功能

如果你有问题,告诉我

多谢各位

PS:ddb文件中的扫描函数如下所示

//ddb.js

module.exports.scan = async params => {
    const result = await DynamoDB.scan(params).promise();
    return result.Items;
};

下面是一个单元测试解决方案:

tools.js

constddb=require('./ddb');
const table=process.env.TableName;
module.exports.mailExist=异步电子邮件=>{
如果(!电子邮件){
抛出新错误(“缺少参数”);
}
返回等待ddb扫描({
TableName:table,
FilterExpression:'电子邮件=:电子邮件',
表达式属性值:{
“:电子邮件”:电子邮件
},
ProjectionExpression:['uid']
});
};
tools.spec.js
,在需要
tools.js
之前,应该先设置环境变量。我们将原始的
TableName
环境变量存储到一个变量中,并在所有单元测试完成后恢复环境变量

constddb=require('./ddb');
描述('mailExist',()=>{
const TableName=process.env.TableName;
const fakeTableName='假表名';
以前(()=>{
process.env.TableName=fakeTableName;
});
毕竟(()=>{
process.env.TableName=表名;
});
测试('不应存在',异步()=>{
常量工具=需要(“./工具”);
常数电子邮件example@example.com';
const scanSpy=jest.spyOn(ddb,'scan').mockResolvedValueOnce({});
const actualValue=wait tools.mailExist(电子邮件);
expect(实际值).toEqual({});
期望(扫描间谍)。使用({
表名:fakeTableName,
FilterExpression:'电子邮件=:电子邮件',
表达式属性值:{
“:电子邮件”:电子邮件
},
ProjectionExpression:['uid']
});
});
});
单元测试结果:

PASS src/stackoverflow/58727351/tools.spec.js
梅莱克斯
✓ 不应存在(112ms)
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 80 | 66.67 | 66.67 | 75 ||
ddb.js | 50 | 100 | 0 | 50 | 3|
tools.js | 87.5 | 66.67 | 100 | 83.33 | 7|
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:5.095s,估计8s

您好,谢谢您的回复。我用过你的代码,但我还有最后一个问题。scanSpy不是用fakeTableName调用的,而是用TableName调用的variable@dc-mpo这个例子运行良好。我猜您正在使用
dotenv
模块从
.env
加载环境变量,这将影响测试结果。而且,我不知道如何在
tools.js
文件中使用
process.env.TableName
环境变量。你可以编辑你的问题,添加更多信息。我已经编辑了我的问题,我已经有了脚本的开头,在那里我为mailExist调用了我的环境变量,是的,我将dotenv与jest.config.js文件一起使用,在那里我导出了一个安装文件,其中我不需要
require(“dotenv”).config()
我明白为什么它不适合我,这是因为我在函数之外创建了我的常量TableName,我在文件的开头创建它。谢谢你的帮助,你让我摆脱了困境:)