Как проверить обещание, которое подключается к RabbitMQ? - PullRequest
0 голосов
/ 15 декабря 2018

Привет! Я использую Chai и пытаюсь протестировать пользовательскую функцию, которая подключается к RabbitMQ, передавая неправильный хост:

connect(host) {
    return new Promise((resolve, reject) => {
      amqp.connect(host)
        .then((conn) => {
          resolve(conn);
        })
        .catch((err) => {
          throw new Error(err);
        });
    });
  }

Если соединение не удается, я выдаю ошибку, поэтому я тестирую ее какthis:

it('shouldnt connect to RabbitMQ service successfully with the wrong host.', async () => {
      const result = await rabbitmqmailer.connect('amqp://wronghost');
      expect(result).to.equal(Error);
    });

Соединение не устанавливается и выдает ошибку, но мой тест не проверяет это, просто я получил исключение на своем терминале:

RabbitMQMailer component.
    RabbitMQMailer configuration information.
      ✓ should test rabbitmqmailer host configuration.
      ✓ should test rabbitmqmailer queue configuration.
      ✓ should get rabbitmqmailer empty emailContent value after make a new instance.
      ✓ should get rabbitmqmailer empty emailContentConsumed value after make a new instance.
      ✓ resolves
      ✓ should connect to RabbitMQ service successfully with the correct host. (60ms)
Unhandled rejection Error: Error: getaddrinfo EAI_AGAIN wronghost wronghost:5672
    at _amqplib2.default.connect.then.catch.err (/home/ubuntu/Desktop/easy-tracking/backend/src/components/rabbitmqmailer/rabbitmqmailer.dal.js:1:11069)
    at tryCatcher (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:690:18)
    at _drainQueueStep (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:17:14)
    at processImmediate (timers.js:632:19)

      1) shouldnt connect to RabbitMQ service successfully with the wrong host.

Я попытался перехватить исключение наблок trycatch, но это та же проблема.

РЕДАКТИРОВАТЬ : Я получил эту ошибку на терминале после изменения моего теста на:

it('shouldnt connect to RabbitMQ service successfully with the wrong host.', async (done) => {
      const result = await rabbitmqmailer.connect('amqp://wronghost');
      expect(result).to.be.an.instanceof(Error);
      done();
    });


(node:18911) UnhandledPromiseRejectionWarning: Error: Error: getaddrinfo EAI_AGAIN wronghost wronghost:5672
    at _amqplib2.default.connect.then.catch.err (/home/ubuntu/Desktop/easy-tracking/backend/src/components/rabbitmqmailer/rabbitmqmailer.dal.js:1:11475)
    at tryCatcher (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/promise.js:690:18)
    at _drainQueueStep (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues (/home/ubuntu/Desktop/easy-tracking/backend/node_modules/amqplib/node_modules/bluebird/js/release/async.js:17:14)
    at processImmediate (timers.js:632:19)
(node:18911) 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: 2)
(node:18911) [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) shouldnt connect to RabbitMQ service successfully with the wrong host.


1) RabbitMQMailer component.
       RabbitMQMailer configuration information.
         shouldnt connect to RabbitMQ service successfully with the wrong host.:
     Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/ubuntu/Desktop/easy-tracking/backend/src/components/rabbitmqmailer/rabbitmqmailer.test.js)

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Наконец-то я нашел способ проверить это

it('shouldnt connect to RabbitMQ service successfully with the wrong host.', (done) => {
      (async () => {
        try {
          await rabbitmqmailer.connect('amqp://wronghost');
        } catch (error) {
          chai.assert.typeOf(error, 'error');
        } finally {
          done();
        }
      })();
    });

Но есть какая-то странная проблема: если я изменяю тип, например, на 'string', он говорит мне:

(node:26053) UnhandledPromiseRejectionWarning: AssertionError: expected [Error: Error: getaddrinfo EAI_AGAIN wronghost wronghost:5672] to be a string

Но!тест успешно пройден:

 ✓ shouldnt connect to RabbitMQ service successfully with the wrong host.

Я не знаю, почему это произошло, но все равно работает, спасибо за помощь.

0 голосов
/ 15 декабря 2018

Вам нужно reject Обещание.

connect(host) {
    return new Promise((resolve, reject) => {
      amqp.connect(host)
        .then((conn) => resolve(conn))
        .catch((err) => reject(new Error(err));
   });
}

и тест

it('shouldnt connect to RabbitMQ service successfully with the wrong host.', () => {
  return rabbitmqmailer.connect('amqp://wronghost')
    .then(() => { assert.fail('was not supposed to succeed'); })
    .catch((err) => { expect(err).to.be.an.instanceof(Error); })
})
0 голосов
/ 15 декабря 2018

Обычно вы хотите, чтобы ваши тесты были изолированы.Я бы порекомендовал насмехаться над объектом amqp и ожидать, что вызывается метод connect

Важно, чтобы вы попробовали понять настоящий метод connect, прежде чем разрабатывать макет

Вы можете использовать фреймворк, такой как https://sinonjs.org/

0 голосов
/ 15 декабря 2018

Вы не правильно терпите неудачу.Вы забыли о reject.Сделайте это вместо:

connect(host) {
    return new Promise((resolve, reject) => {
      amqp.connect(host)
        .then((conn) => {
          resolve(conn);
        })
        .catch((err) => {
          reject(new Error(err)); // Pass the error to reject
        });
    });
  }

В своем тесте используйте instanceof, чтобы соответствовать Error, которое возвращается:

it('shouldnt connect to RabbitMQ service successfully with the wrong host.', async () => {
      const result = await rabbitmqmailer.connect('amqp://wronghost');
      expect(result).to.be.an.instanceof(Error);
    });

ТакжеЯ не знаю, что вы используете для тестирования, но если это jest, то эта ссылка может помочь вам правильно протестировать обещание.

РЕДАКТИРОВАТЬ : Собственно нвм.Я вижу, что вы используете чай

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