Jest 25.3.0
Я пытаюсь смоделировать зависимость DynamoDB в моих модульных тестах следующим образом:
const { findById } = require('./mymodule');
const mockDynamoDB = { getItem: jest.fn() };
jest.mock('aws-sdk', () => ({
DynamoDB: jest.fn(() => mockDynamoDB)
}));
describe('.', () => {
it('..', () => {
findById('test');
expect(mockDynamoDB.getItem).toBeCalledWith({
TableName: 'table-name',
Key: {
id: { S: 'test' }
}
});
});
});
К сожалению, когда я это делаю, я получаю следующую ошибку:
ReferenceError: Cannot access 'mockDynamoDB' before initialization
Странно, если я сделаю это, я могу избежать ReferenceError
:
const mockGetItem = { promise: jest.fn() };
jest.mock('aws-sdk', () => ({
DynamoDB: jest.fn(() => ({
getItem: jest.fn(() => mockGetItem)
})
}));
, но это не подходит моему тесту, так как я могу не проверяет параметры, переданные в функцию getItem
.
Реальный тестируемый код довольно прост, он выглядит примерно так:
const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
const toRecord = (item) => ({
id: item.id.S,
name: item.name.S
});
const findById = (id) => (
dynamodb.getItem({
TableName: 'table-name',
Key: {
id: { S: id }
}
}).promise()
.then(result => toRecord(result.Item))
.catch(error => console.log(error)
);
module.exports = {
findById
}
Если кто-то видел это раньше, или может пролить свет на то, почему первый пример терпит неудачу, а второй работает, это действительно поможет мне. Спасибо.