在函数中跳过S3 Get Object调用



我正在测试一个标准的S3 Get Object调用,但是当Jest测试我的函数时,它跳过Get Object调用并跳到函数的末尾,结束执行并且不返回任何东西。当我检查代码覆盖率时,除了getObject调用之外,所有行都被覆盖了。

这是我正在测试的s3文件。我在那里设置了检查点,以显示s3。Jest正在跳过getObject调用。

const AWS = require('aws-sdk');
const s3 = new AWS.S3({ apiVersion: '2012-11-05 ' })
function getS3Object(bucket, file) {
return new Promise((resolve, reject) => {
console.log('Checkpoint 1')
const parameters = {
Bucket: bucket,
Key: file
}
s3.getObject(parameters, (error, data) => {
console.log('checkpoint 2')
if (error) {
console.log('error')
reject(error)
} else {
console.log('success')
resolve(data)
}
})
console.log('Checkpoint 3')
})
}
module.exports = {
getS3Object
}

这是我的测试文件

const s3Handler = require('../s3')
const AWS = require('aws-sdk')

jest.mock('aws-sdk', () => {
const mockS3 = {
getObject: jest.fn().mockReturnThis(),
promise: jest.fn()
}
return {
config: {
update() {
return {};
}
},
S3: jest.fn(() => mockS3)
}
})
describe('S3 get object test', () => {
test('test', async () => {
const mockS3 = new AWS.S3();
mockS3.getObject('test-bucket', 'test-key').promise.mockResolvedValueOnce('s3file.js');
const output = s3Handler.getS3Object('test-bucket', 'test-key');
expect(output).resolves.toEqual('blah')
})
})

这个测试通过了(即使期望状态是错误的)。它应该返回's3File.js',而不是'blah',但测试通过了)。对于控制台日志,只会命中检查点1和3—函数会忽略整个S3调用。这是我如何嘲笑s3的问题吗?

由于s3.getObject()接受错误优先回调,它不是JS承诺,您应该使用.mockImplementation((params, callback) => callback(mockErr, mockData))模拟错误优先回调,并使用模拟数据或错误调用它。

s3.js:

const AWS = require('aws-sdk');
const s3 = new AWS.S3({ apiVersion: '2012-11-05 ' });
function getS3Object(bucket, file) {
return new Promise((resolve, reject) => {
console.log('Checkpoint 1');
const parameters = {
Bucket: bucket,
Key: file,
};
s3.getObject(parameters, (error, data) => {
console.log('checkpoint 2');
if (error) {
console.log('error');
reject(error);
} else {
console.log('success');
resolve(data);
}
});
console.log('Checkpoint 3');
});
}
module.exports = { getS3Object };

s3.test.js:

const s3Handler = require('./s3');
const AWS = require('aws-sdk');
jest.mock('aws-sdk', () => {
const mockS3 = { getObject: jest.fn() };
return {
config: {
update() {
return {};
},
},
S3: jest.fn(() => mockS3),
};
});
describe('S3 get object test', () => {
let mockS3;
beforeAll(() => {
mockS3 = new AWS.S3();
});
test('should get object', async () => {
mockS3.getObject.mockImplementation((params, callback) => {
callback(null, 's3file.js');
});
const output = s3Handler.getS3Object('test-bucket', 'test-key');
await expect(output).resolves.toEqual('s3file.js');
});
test('should handle error', async () => {
const mError = new Error('fake error');
mockS3.getObject.mockImplementation((params, callback) => {
callback(mError);
});
const output = s3Handler.getS3Object('test-bucket', 'test-key');
await expect(output).rejects.toThrow(mError);
});
});

测试结果:

PASS  stackoverflow/72694206/s3.test.js (10.902 s)
S3 get object test
✓ should get object (18 ms)
✓ should handle error (4 ms)
console.log
Checkpoint 1
at stackoverflow/72694206/s3.js:7:13
console.log
checkpoint 2
at stackoverflow/72694206/s3.js:13:15
console.log
success
at stackoverflow/72694206/s3.js:18:17
console.log
Checkpoint 3
at stackoverflow/72694206/s3.js:22:13
console.log
Checkpoint 1
at stackoverflow/72694206/s3.js:7:13
console.log
checkpoint 2
at stackoverflow/72694206/s3.js:13:15
console.log
error
at stackoverflow/72694206/s3.js:15:17
console.log
Checkpoint 3
at stackoverflow/72694206/s3.js:22:13
----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
s3.js    |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.513 s, estimated 12 s

最新更新