Мокко выдает слишком длинное сообщение об ошибке при тестировании node.js - PullRequest
0 голосов
/ 04 июля 2018

Я изучаю node.js и как тестировать функции. У меня проблема при использовании mocha: когда функции проходят тестирование, все в порядке, я получаю приятное сообщение.

Но если какая-либо функция, которая не проходит тест - например, результат в тесте - 0, но намеренно я написала предположение, чтобы ожидать 1 - это дает мне массаж ошибок длиной в милю в консоли bash-cli-console:

Async functions
    (node:6001) UnhandledPromiseRejectionWarning: AssertionError [ERR_ASSERTION]: 0 == 1
        at utils.requestWikiPage.then.resBody (/home/sandor/Documents/learning-curve-master/node-dev-course/testing-tut/utils/utils.test.js:10:20)
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:188:7)
    (node:6001) 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:6001) [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.
        1) it should return a html page


      0 passing (2s)
      1 failing

      1) Async functions
           it should return a html page:
         Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/sandor/Documents/learning-curve-master/node-dev-course/testing-tut/utils/utils.test.js)
      



    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! dev-course@1.0.0 test: `mocha ./testing-tut/**/*.test.js`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the dev-course@1.0.0 test script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

    npm ERR! A complete log of this run can be found in:
    npm ERR!     /home/sandor/.npm/_logs/2018-07-04T11_31_53_292Z-debug.log
    [nodemon] app crashed - waiting for file changes before starting...

Я не знаю, почему я получаю эту часть: UnhandledPromiseRejectionWarning ... и почему я получаю эту часть: npm ERR! код ELIFECYCLE

функция, которую я тестирую: (она отправляет запрос в википедию на вики-страницу Джорджа Вашингтона и собирает html-страницу из ответа. На «конце» readstream она разрешает html-страницу. Функция работает просто штраф)

// utils.js
function requestWikiPage() {
    const reqOpts = {
        hostname : 'en.wikipedia.org',
        port : 443,
        path : '/wiki/George_Washington',
        method : "GET"
    }

    return new Promise(resolve => {
        let req = https.request(reqOpts, (res) => {
            let resBody = "";
            res.setEncoding('utf-8');

            res.on('data', (chunk) => {
                resBody += chunk;
            });

            res.on('end', () => {
              resolve(resBody);  
            });
        });

        req.on('err', (err) => {
            console.log(err);
        });

        req.end();
    });
}

module.exports.requestWikiPage = requestWikiPage;

Код Мокко: (Переменная 'resBody' - это строка, содержащая html-страницу, где '' находится с индексом 0. В утверждении я проверяю его на 1, чтобы создать сообщение об ошибке)

const utils = require('./utils');
var assert = require('assert');

describe('Async functions', function() {
    it('it should return a html page', (done) => {
        utils.requestWikiPage().then(resBody => {
            assert.equal(resBody.indexOf('<!DOCTYPE html>'), 1);
            done();
        });
    });
});

Так что я не понимаю, почему я получаю это длинное сообщение об ошибке только потому, что я ожидаю, что не в индексе 0, а в первом? (На самом деле я получаю это сообщение об ошибке с каждой функцией не только с этим) Как мне настроить мокко, чтобы оно давало мне более минимальное и интуитивно понятное сообщение об ошибке. Большое спасибо за ваши ответы

1 Ответ

0 голосов
/ 04 июля 2018

Вам необходимо правильно отклонить обещание в #requestWikiPage, если оно не разрешается или есть ошибка, а затем обработать это отклонение в своем тесте. Следующие изменения, вероятно, решат проблему в вашем вопросе (то есть, если mocha правильно обработает неудачный тест без лишних выходных данных), но следующим шагом, очевидно, будет прохождение теста.

Обратите внимание, что мы добавляем обратный вызов к нашему new Promise() и вместо console.log(err); ниже в вашем req.on('error'... обратном вызове, теперь мы используем reject в качестве нашего обратного вызова с ошибкой.

// utils.js
function requestWikiPage() {
    const reqOpts = {
        hostname : 'en.wikipedia.org',
        port : 443,
        path : '/wiki/George_Washington',
        method : "GET"
    }

    return new Promise((resolve, reject) => {
        let req = https.request(reqOpts, (res) => {
            let resBody = "";
            res.setEncoding('utf-8');

            res.on('data', (chunk) => {
              resBody += chunk;
            });

            res.on('end', () => {
              resolve(resBody);  
            });
        });

        req.on('err', reject);

        req.end();
    });
}

module.exports.requestWikiPage = requestWikiPage;

А теперь обработайте, если обещание было отклонено через блок catch, используя done в качестве обратного вызова catch (что фактически передало бы ошибку в done, что требуется для mocha).

const utils = require('./utils');
var assert = require('assert');

describe('Async functions', function() {
    it('it should return a html page', (done) => {
        utils.requestWikiPage().then(resBody => {
            assert.equal(resBody.indexOf('<!DOCTYPE html>'), 1);
            done();
        }).catch(done);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...