在无服务器应用程序上使用Jest进行测试

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

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

我在 tools.js 文件

中具有这样的功能
const ddb = require('./ddb');
const table = process.env.USER_TABLE;

...

module.exports.mailExist = async email => {
  if (!email) {
    throw new Error('Missing parameters');
  }
  return await ddb.scan({
    TableName: table,FilterExpression: 'email = :email',ExpressionAttributeValues: {
      ':email': email
    },ProjectionExpression: ['uid']
  });
};

我想在 __ test __ / tools.test.js 文件中进行测试

describe('mailExist',async () => {
    const email = 'example@example.com';
    const mailExist = await tools.mailExist(email)
    it('should not exist',() => {
        expect(mailExist).toBe({})
    })
});

问题是,当我运行测试时,它会返回

  

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

因为我的“表”变量是环境变量

如果我因为环境变量而写了我的表名,它将返回

  

配置中缺少区域

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

如果您有任何问题,请告诉我

谢谢

PS:我在ddb文件中的扫描功能如下所示

//ddb.js

module.exports.scan = async params => {
    const result = await DynamoDB.scan(params).promise();
    return result.Items;
};
huangyi_liyanping 回答:在无服务器应用程序上使用Jest进行测试

这是单元测试解决方案:

tools.js

const ddb = require('./ddb');

const table = process.env.TableName;

module.exports.mailExist = async email => {
  if (!email) {
    throw new Error('Missing parameters');
  }
  return await ddb.scan({
    TableName: table,FilterExpression: 'email = :email',ExpressionAttributeValues: {
      ':email': email
    },ProjectionExpression: ['uid']
  });
};

tools.spec.js,应先设置环境变量,然后再要求tools.js。我们将原始的TableName环境变量存储到一个变量中,并在完成所有单元测试后恢复环境变量。

const ddb = require('./ddb');

describe('mailExist',() => {
  const TableName = process.env.TableName;
  const fakeTableName = 'fake table name';
  beforeAll(() => {
    process.env.TableName = fakeTableName;
  });
  afterAll(() => {
    process.env.TableName = TableName;
  });

  test('should not exist',async () => {
    const tools = require('./tools');
    const email = 'example@example.com';
    const scanSpy = jest.spyOn(ddb,'scan').mockResolvedValueOnce({});
    const actualValue = await tools.mailExist(email);
    expect(actualValue).toEqual({});
    expect(scanSpy).toBeCalledWith({
      TableName: fakeTableName,ExpressionAttributeValues: {
        ':email': email
      },ProjectionExpression: ['uid']
    });
  });
});

单元测试结果:

PASS  src/stackoverflow/58727351/tools.spec.js
  mailExist
    ✓ should not exist (112ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |       80 |    66.67 |    66.67 |       75 |                   |
 ddb.js   |       50 |      100 |        0 |       50 |                 3 |
 tools.js |     87.5 |    66.67 |      100 |    83.33 |                 7 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed,1 total
Tests:       1 passed,1 total
Snapshots:   0 total
Time:        5.095s,estimated 8s
本文链接:https://www.f2er.com/3153362.html

大家都在问