Ошибка утверждения при тестировании асинхронной функции с помощью mocha и chaiAsPromised

Итак, я пытаюсь проверить, что моя асинхронная функция выдает ошибку, когда я заглушаю s3GetObject = Promise.promisify(s3.getObject.bind(s3)), который должен быть отклонен с помощью blah, однако я получаю, что моя функция не является асинхронной и не выдает ошибку.

ниже мой main.js файл с tests.js этого:

const Promise = require('bluebird');
const AWS = require('aws-sdk');

const s3 = new AWS.S3({
});

const s3GetObject = Promise.promisify(s3.getObject.bind(s3));

async function getS3File(){
  try {
    const contentType = await s3GetObject(s3Params);
    console.log('CONTENT:', contentType);
    return contentType;
  } catch (err) {
    console.log(err);
   throw new Error(err);
  }
};

Тестирование:

    /* eslint-env mocha */
const rewire = require('rewire');
const chai = require('chai');
const sinonChai = require('sinon-chai');
const sinon = require('sinon');
const chaiAsPromised = require('chai-as-promised');

chai.should();
chai.use(sinonChai);
chai.use(chaiAsPromised);

describe('Main', () => {

  describe('getFileFromS3', () => {
    let sut, getS3File, callS3Stub;

    beforeEach(() => {
      sut = rewire('../../main');
      getS3File = sut.__get__('getS3File');
      sinon.spy(console, 'log');
    });

    afterEach(() => {
      console.log.restore();
    });

    it('should be a function', () => {
      getS3File.should.be.a('AsyncFunction');
    });

    describe('with error', () => {
      beforeEach(() => {
        callS3Stub = sinon.stub().rejects('blah');
        sut.__set__('s3GetObject', callS3Stub);
        getS3File = sut.__get__('getS3File');
      });

      it('should error with blah', async () => {
        await getS3File.should.throw();
        //await console.log.should.be.calledWith('blah');

      });
    });
  });
});

Я получаю следующие ошибки: 1) Основная

getFileFromS3 должен быть функцией: AssertionError: ожидается, что [Function: getS3File] будет асинхронной функцией в Context.it (test \ unit \ main.spec.js: 28: 27)

2) Основное

getFileFromS3 с ошибкой должна выдать ошибку с blah: AssertionError: ожидается [Function: getS3File], чтобы выдать ошибку

UnhandledPromiseRejectionWarning: ошибка: blah UnhandledPromiseRejectionWarning: необработанное отклонение обещания.

Эта ошибка возникла либо из-за вставки внутри асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch(). (rejection id: 228)


person Lauren Buxton    schedule 14.09.2018    source источник
comment
getS3File = сут .__ получить __ ('getS3File'); . эта строка вызывает проблему, я думаю. Вы меняете ссылку на асинхронную функцию на другое значение. измените имя переменной getS3File на другое и попробуйте   -  person subbu    schedule 14.09.2018


Ответы (1)


Как объясняется в этом ответе, не имеет значения, функция async или нет, если она возвращает обещание. Чай использует type-detect для обнаружения типов и определяет async функцию как function.

Должен быть:

getS3File.should.be.a('function');

async функции являются синтаксическим сахаром для обещаний, они не вызывают ошибок, а возвращают отклоненные обещания.

Должен быть:

getS3File().should.be.rejectedWith(Error); 
person Estus Flask    schedule 14.09.2018