我是打字稿中嘲笑的初学者。我想在我的单元测试中模拟AWS.Comprehend。我有这段带有AWS服务理解的代码。
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;
};我试图为我的代码编写一个单元测试。
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的错误是什么?
发布于 2020-04-29 11:22:39
您可以使用jest.mock(moduleName,工厂,选项)来模拟aws-sdk包、Comprehend类及其实例方法。
例如。
index.ts
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
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%覆盖范围的单元测试结果:
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发布于 2020-04-29 16:44:30
如果我将const人大=newAWS.Comprehend();移到处理程序()中:
export const handler = async (): Promise<any> => {
const comprehend = new AWS.Comprehend();
// something
}我的测试成功了。怎么做才能不动它呢?
https://stackoverflow.com/questions/61497560
复制相似问题