У меня есть асинхронная функция, и я хочу проверить как: успех, так и неудачу.В случае успеха функция возвращает строку, при ошибке -Я с треском проваливаюсь при неудачном тестировании.Вот мой код:
Я отключил, комментируя неудачный код, и добавил результаты в комментарии
'use strict';
const path = require('path');
const fs = require('fs');
const getKmlFilename = require('./getKmlFileName.js');
const createGoodFolder = () => {
const folderPath = fs.mkdtempSync('/tmp/test-getKmlFilename-');
const fileDescriptor = fs.openSync(path.join(folderPath, 'doc.kml'), 'w');
fs.closeSync(fileDescriptor);
return folderPath;
};
const createEmptyFolder = () => fs.mkdtempSync('/tmp/test-getKmlFilename-');
describe('/app/lib/getKmlFilename', () => {
// Success tests
test('Should return a KML filename', async () => {
const result = await getKmlFilename(createGoodFolder());
expect(result).toMatch(/\.kml$/);
});
// Failure tests
test('Should throw if no KML files in folder', () => {
// Expected one assertion to be called but received zero assertion calls.
// expect.assertions(1);
// expect(function).toThrow(undefined)
// Received value must be a function, but instead "object" was found
//return getKmlFilename(createEmptyFolder())
// .catch(e => expect(e).toThrow());
// expect(string)[.not].toMatch(expected)
// string value must be a string.
// Received:
// object:
// [Error: No valid KML file in /tmp/test-getKmlFilename-j2XxQ4]
return getKmlFilename(createEmptyFolder())
.catch(e => expect(e).toMatch('No valid KML file in'));
});
test('Should throw if no KML files in folder - try/catch version',
async () => {
// Expected one assertion to be called but received zero assertion calls.
// expect.assertions(1);
try {
const result = await getKmlFilename(createEmptyFolder());
} catch (e) {
// Received value must be a function, but instead "object" was found
// expect(e).toThrow();
// expect(string)[.not].toMatch(expected)
// string value must be a string.
// Received:
// object:
// [Error: No valid KML file in /tmp/test-getKmlFilename-3JOUAX]
expect(e).toMatch('No valid KML file in');
}
});
});
Как видите, ничего не работает.Я считаю, что мои тесты являются почти точной копией примера Promises для первого теста на сбой и примера Async / Await для последнего, однако ни один из них не работает.
IПолагаю, что отличие от примеров из документации Jest состоит в том, что они показывают, как протестировать функцию throw
s и как проверить Promise, что reject
s.Но мое обещание отклоняется, бросая.
Проверка функции в консоли узла Я получаю этот журнал:
// import function
> getKml = require('./getKmlFileName.js')
[AsyncFunction: getKmlFilename]
// trying it with a proper folder shows we get a Promise
> getKml('/tmp/con')
Promise {
<pending>,
domain:
Domain {
domain: null,
_events: { error: [Function: debugDomainError] },
_eventsCount: 1,
_maxListeners: undefined,
members: [] } }
// trying it with a failing folder shows it's a rejected promise which throws
> getKml('/tmp/sin')
Promise {
<pending>,
domain:
Domain {
domain: null,
_events: { error: [Function: debugDomainError] },
_eventsCount: 1,
_maxListeners: undefined,
members: [] } }
> (node:10711) UnhandledPromiseRejectionWarning: Error: No valid KML file in /tmp/sin
at getKmlFilename (/home/flc/soft/learning/2018.06.08,jest/getKmlFileName.js:14:11)
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
(node:10711) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:10711) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Как видно из встроенных комментариев, функция делает то, что должнаОднако я не знаю, как проверить это в Jest.Буду очень признателен за любую помощь.
Если код здесь выглядит слишком запутанным, я подготовил репозиторий , в котором содержатся мои несчастья, изучающие Jest
ОБНОВЛЕНИЕ 2018.06.12:
Каким-то образом мое сообщение было зашифровано и потеряло первую часть, которая была реальным кодом, который я пытаюсь проверить, мои извинения за это, вот оно:
getKmlFileName.js
'use strict';
const globby = require('globby');
const path = require('path');
const getKmlFilename = async (workDir) => {
const pattern = path.join(workDir, '**/*.kml');
const files = await globby(pattern);
if (files && files.length > 0) {
// Return first KML found, if there are others (improbable), ignore them
return path.basename(files[0]);
} else {
throw new Error(`No valid KML file in ${workDir}`);
}
};
module.exports = getKmlFilename;