首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何用Sinon,AWS模拟来模拟aws服务?

我如何用Sinon,AWS模拟来模拟aws服务?
EN

Stack Overflow用户
提问于 2020-04-29 08:39:04
回答 2查看 735关注 0票数 0

我是打字稿中嘲笑的初学者。我想在我的单元测试中模拟AWS.Comprehend。我有这段带有AWS服务理解的代码。

代码语言:javascript
复制
const comprehend = new AWS.Comprehend();

export const handler = async (): Promise<any> => {

const params = {
    JobName: "first-job",
    InputDataConfig: {
        S3Uri: "input_bucket_name",
        InputFormat: "ONE_DOC_PER_FILE"
    },
    OutputDataConfig: {
        S3Uri: "output_bucket_name"
    },
    DataAccessRoleArn: "role_arn"
};

const result = await comprehend.startDominantLanguageDetectionJob(params)
            .promise()
            .catch(error => {
                    throw error;
                }
            );

    return result.JobId;
};

我试图为我的代码编写一个单元测试。

代码语言:javascript
复制
import { expect } from 'chai';
import * as AWSMock from 'aws-sdk-mock';
import * as AWS from 'aws-sdk';

describe('unitTest', () => {
    before(() => {
        AWSMock.setSDKInstance(AWS);
        AWSMock.mock('Comprehend', 'startDominantLanguageDetectionJob', (params, cb) => {
            cb(null, { jobId: 'test_job_id', JobStatus: 'SUBMITTED' });
        });
    });

    it('should pass', async () => {
        const result = await handler();

        expect(result).to.be.eql('test_job_id');
    });
});

但我的代码不起作用。在我看来,Comprehend并不是一种模仿。并运行正常的startDominantLanguageDetectionJob,而不是模拟。使用aws-sdk-mock的错误是什么?

EN

回答 2

Stack Overflow用户

发布于 2020-04-29 11:22:39

您可以使用jest.mock(moduleName,工厂,选项)来模拟aws-sdk包、Comprehend类及其实例方法。

例如。

index.ts

代码语言:javascript
复制
import AWS from 'aws-sdk';

const comprehend = new AWS.Comprehend();

export const handler = async (): Promise<any> => {
  const params = {
    JobName: 'first-job',
    InputDataConfig: {
      S3Uri: 'input_bucket_name',
      InputFormat: 'ONE_DOC_PER_FILE',
    },
    OutputDataConfig: {
      S3Uri: 'output_bucket_name',
    },
    DataAccessRoleArn: 'role_arn',
  };

  const result = await comprehend
    .startDominantLanguageDetectionJob(params)
    .promise()
    .catch((error) => {
      throw error;
    });

  return result.JobId;
};

index.test.ts

代码语言:javascript
复制
import MockAWS from 'aws-sdk';
import { handler } from './';

jest.mock('aws-sdk', () => {
  const mComprehend = {
    startDominantLanguageDetectionJob: jest.fn().mockReturnThis(),
    promise: jest.fn(),
  };
  return {
    Comprehend: jest.fn(() => mComprehend),
  };
});

describe('61497560', () => {
  afterEach(() => {
    jest.clearAllMocks();
  });
  it('should return job id', async () => {
    const mComprehend = new MockAWS.Comprehend();
    const mResponse = { JobId: 1 };
    (mComprehend.startDominantLanguageDetectionJob().promise as jest.Mocked<any>).mockResolvedValueOnce(mResponse);
    const actual = await handler();
    expect(actual).toBe(1);
    expect(mComprehend.startDominantLanguageDetectionJob).toBeCalledWith({
      JobName: 'first-job',
      InputDataConfig: {
        S3Uri: 'input_bucket_name',
        InputFormat: 'ONE_DOC_PER_FILE',
      },
      OutputDataConfig: {
        S3Uri: 'output_bucket_name',
      },
      DataAccessRoleArn: 'role_arn',
    });
    expect(mComprehend.startDominantLanguageDetectionJob().promise).toBeCalledTimes(1);
  });

  it('should throw error', async () => {
    const mComprehend = new MockAWS.Comprehend();
    const mError = new Error('network');
    (mComprehend.startDominantLanguageDetectionJob().promise as jest.Mocked<any>).mockRejectedValueOnce(mError);
    await expect(handler()).rejects.toThrow('network');
    expect(mComprehend.startDominantLanguageDetectionJob).toBeCalledWith({
      JobName: 'first-job',
      InputDataConfig: {
        S3Uri: 'input_bucket_name',
        InputFormat: 'ONE_DOC_PER_FILE',
      },
      OutputDataConfig: {
        S3Uri: 'output_bucket_name',
      },
      DataAccessRoleArn: 'role_arn',
    });
    expect(mComprehend.startDominantLanguageDetectionJob().promise).toBeCalledTimes(1);
  });
});

100%覆盖范围的单元测试结果:

代码语言:javascript
复制
 PASS  stackoverflow/61497560/index.test.ts (10.06s)
  61497560
    ✓ should return job id (8ms)
    ✓ should throw error (2ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.ts |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.292s
票数 0
EN

Stack Overflow用户

发布于 2020-04-29 16:44:30

如果我将const人大=newAWS.Comprehend();移到处理程序()中:

代码语言:javascript
复制
export const handler = async (): Promise<any> => {
  const comprehend = new AWS.Comprehend();
 // something
}

我的测试成功了。怎么做才能不动它呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61497560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档