Тестирование / издевательство над хранилищем данных Google в nodejs
const Datastore = require('@google-cloud/datastore');
const datastore = Datastore();
function listTasks(res) {
const query = datastore.createQuery('Test');
datastore.runQuery(query)
.then((results) => {
const tasks = results[0];
tasks.forEach((task) => {
const taskKey = task[datastore.KEY];
console.log(taskKey.id, task);
});
res.send(tasks);
})
.catch((err) => {
console.error('ERROR:', err);
});
}
Я хочу выполнить приведенный выше код, но не знаю, как смоделировать / заглушить объект / методы облачного хранилища данных Google. Например, я хочу смоделировать / заглушку datastore.createQuery('Test'), но не знаю как.
1 ответ
Там не так много, вы можете сделать. Либо смоделируйте все хранилище данных самостоятельно, используйте локальный эмулятор или используйте только те методы, которые вам нужны для каждого теста.
Первый подход может быть экономичным и сложным, но он гарантирует наилучшее время отклика и скорость тестирования.
Второй подход также будет работать, но в моей практике это работает не быстрее, чем реальное хранилище данных в проекте. Я имею в виду, что время отклика локального эмулятора на моей машине составляет около 30 - 400 мс, что почти так же, как при использовании удаленного экземпляра хранилища данных. Не знаю почему, может я что-то не так сделал. Вы можете попробовать по крайней мере.
Третий подход будет чем-то промежуточным из первых двух, но вы начнете тестировать реализацию вместо поведения, и такой тест станет бесполезным. Но это только мое мнение относительно такого подхода.
Есть еще один подход, четвертый - разложить такой метод, чтобы у них не было кода связи с базой данных, а только алгоритмическая часть. Протестируйте такой код, а не тот, который вызывает методы db.
Так что я сам столкнулся с проблемой и вот как я решил ее.
Скажем, ваш каталог выглядит следующим образом:
+-- node_modules
+-- src
| +-- service.js
+-- package.json
И ваш service.js
файл использует хранилище данных GCP, т.е.
const Datastore = require('@google-cloud/datastore')
const datastore = Datastore()
//some other code ...
Что вы можете сделать, это создать __mocks__
каталог рядом с node_modules
каталог.
+-- __mocks__
| +-- @google-cloud
| | +-- datastore.js
|
+-- node_modules
+-- src
| +-- service.js
+-- package.json
Где datastore.js должен иметь как минимум следующее:
// datastore.js
function Datastore() {
return ""
}
module.exports = Datastore;
Затем обратитесь к datastore.js
файл в вашем package.json
используя moduleNameMapper
свойство в объекте конфигурации Jest.
//package.json
...
"jest": {
"moduleNameMapper": {
"@google-cloud/datastore": "<rootDir>/__mocks__/@google-cloud/datastore.js"
}
}
<rootDir>
эквивалентно каталогу, в котором находится файл package.json.
Надеюсь, это поможет!