使用Jest.fn()查看s3.upload函数是否被调用...我在做什么错? [英] Using Jest.fn() to see if s3.upload function was called...what am I doing wrong?

查看:229
本文介绍了使用Jest.fn()查看s3.upload函数是否被调用...我在做什么错?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对测试有点陌生,并且在这个问题上已经停留了很长时间.因此,我尝试测试s3.upload()函数以查看是否调用了该函数,而不是查看它是否实际上上载了该对象.唯一的限制是我不能使用任何npm软件包来模拟s3存储桶的功能.

I am a bit new to testing and I have been stuck on this issue for quite some time. So I am trying to test a s3.upload() function to see if it called, not to see if it actually uploads the object. The only constraint is that I cannot use any npm packages to mock out the functionality of the s3 bucket.

我试图按照本教程进行操作(

I was trying to follow this tutorial (How to mock a function inside another function (which I am testing) using sinon?) that uses sinon as a stub, but instead use jest instead. Any help or guidance with issue is appreciated.

// function.js
const uploadToS3 = (params) => {
    const response = s3.upload(params).promise();
    return response;
}

// functions.test.js
describe("Lambda Handler Function", () => {
    test('To test to see if the uploadToS3 function was called', () => {
        const sampleParam = {
            Bucket:  'BucketName',
            Key: 'BucketKey.zip',
            Body: 'SGVsbG8sIFdvcmxk'
        }
        expect(uploadToS3(sampleParam).response).toBeCalled()
    })
})  

推荐答案

您可以使用

You can use jest.mock(moduleName, factory, options) to mock aws-sdk. E.g.

function.js:

import AWS from 'aws-sdk';

const s3 = new AWS.S3();
const uploadToS3 = async (params) => {
  const response = await s3.upload(params).promise();
  return response;
};

export { uploadToS3 };

function.test.js:

import { uploadToS3 } from './function';
import AWSMock from 'aws-sdk';

jest.mock('aws-sdk', () => {
  const mS3 = { upload: jest.fn().mockReturnThis(), promise: jest.fn() };
  return { S3: jest.fn(() => mS3) };
});

describe('60970919', () => {
  it('should pass', async () => {
    const mS3 = new AWSMock.S3();
    const mResponse = { Bucket: 'xxx' };
    mS3.upload({}).promise.mockResolvedValueOnce(mResponse);
    const actual = await uploadToS3({});
    expect(actual).toEqual(mResponse);
    expect(mS3.upload).toBeCalledWith({});
    expect(mS3.upload().promise).toBeCalled();
  });
});

具有100%覆盖率的单元测试结果:

unit test results with 100% coverage:

 PASS  stackoverflow/60970919/function.test.js (13.818s)
  60970919
    ✓ should pass (9ms)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |     100 |      100 |     100 |     100 |                   
 function.js |     100 |      100 |     100 |     100 |                   
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        15.486s

源代码: https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60970919

这篇关于使用Jest.fn()查看s3.upload函数是否被调用...我在做什么错?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆