Функция заглушки не выполняется при выполнении теста с использованием sinon и mocha - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь смоделировать функцию, чтобы пройти тесты, используя sinon и mocha.

app.js:

const express = require('express');
const { isValid } = require('./utils/index');

const config = require('./config.json')[process.env.NODE_ENV || 'development']


const app = express();

app.get('/', (req, res)=> {


    const url = config.url;
   try {
    const validUrl = isValid(url)
    .then(() => {
        return res.redirect(`https://${url}`);
    })
    .catch(() => {
        return res.status(400).send('Unable to redirect to the given url');
    })
   } catch(error) {
      return res.send('Internal Server Error') 
   }




})

const port = process.env.port || 3000;

const server = app.listen(port, ()=> {
    console.log('server listens on 127.0.0.1:3000');
})

module.exports = {server, app};

config.json:

{
"development": {
    "url": "www.stackoverflow.com"
}, 
"test": {
    "url": "www.stackoverflow.com"
}

}

Utils / index.js:

const http = require('http');


module.exports.isValid = (url) => {
    const options = {
        method: 'HEAD',
        host: url
    }
const promise = new Promise((resolve, reject) => {
    const req = http.request(options, () => {
        return resolve(true)
    })
    req.on('error', () => {
        return reject(new Error('Not valid'))
    })

    req.end();
})

return promise;
}

тест / index.js:

const request = require('supertest');
const chai = require('chai');
const sinon = require('sinon');
const index = require('../utils/index')
const { expect } = chai;

const { server } = require('../app');
const {url} = require('../config.json')['test'];



describe('isValid Test', () => {

    it('Should redirects an error when the url is not valid', async() => {

        const stub = sinon.stub(index, 'isValid');
        stub.withArgs(url).returns(Promise.reject(new Error('Not Valid')));
        const { status } = await request(server).get('/');

        expect(status).to.equal(400);

    })
})

Когда я выполняю тест, я получаю эту ошибку:

    (node:23622) UnhandledPromiseRejectionWarning: Error: Not Valid
    at Context.it (/home/hs/perso/mockTests/chaiMock/test/index.js:17:52)
    at callFn (/home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runnable.js:387:21)
    at Test.Runnable.run (/home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runnable.js:379:7)
    at Runner.runTest (/home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runner.js:535:10)
    at /home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runner.js:653:12
    at next (/home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runner.js:447:14)
    at /home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runner.js:457:7
    at next (/home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runner.js:362:14)
    at Immediate.<anonymous> (/home/hs/perso/mockTests/chaiMock/node_modules/mocha/lib/runner.js:425:5)
    at runCallback (timers.js:705:18)
    at tryOnImmediate (timers.js:676:5)
    at processImmediate (timers.js:658:5)
(node:23622) 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:23622) [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.
url:  www.stackoverflow.com
    1) Should redirects an error when the url is not valid


  0 passing (122ms)
  1 failing

  1) isValid Test
       Should redirects an error when the url is not valid:

      AssertionError: expected 302 to equal 400
      + expected - actual

      -302
      +400

      at Context.it (test/index.js:22:27)
      at process._tickCallback (internal/process/next_tick.js:68:7)

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Проблема здесь в том, что ваш модуль приложения необходим и, в свою очередь, извлекает файл utils / index, прежде чем sinon заглушает интересующую вас функцию. Я полагаю, что загрузчик модуля затем кэширует его, так что sinon пытается заглушить его эффект.

Для успешного прохождения теста вам необходимо заблокировать функцию isValid, прежде чем вам понадобится ваше приложение, т.е.

const request = require('supertest');
const chai = require('chai');
const sinon = require('sinon');
const { expect } = chai;

const index = require('../utils/index');

/* Stub here before the server is required */
const stub = sinon.stub(index, 'isValid');

const { server } = require('../app');
const { url } = require('../config.json')['test'];

describe('isValid Test', () => {
  it('Should redirects an error when the url is not valid', async () => {
    stub.withArgs(url).rejects('Not Valid');

    const { status } = await request(server).get('/');

    expect(status).to.equal(400);
  });
});

Кроме того, чтобы перестать видеть отклонение необработанного обещания при выполнении тестов, вы можете использовать .rejects() функцию вместо создания собственного отклоненного обещания.

0 голосов
/ 28 мая 2019

Попробуйте проверить значение, которое вы отправляете на "хосте" по вашему запросу, я полагаю, что вы заходите на "www.stackoverflow.com" и получаете http-код 400, поэтому вы получаете ошибку в своем тесте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...