Как мне выполнить модульное тестирование результата «тогда» обещания в JavaScript? - PullRequest
0 голосов
/ 03 февраля 2019

Я использую TypeScript для написания очень простого сервиса, использующего AWS SDK.Мои модульные тесты Jest проходят, но в отчетах о покрытии говорится, что строка «return result.Items» не покрыта.Может кто-нибудь сказать, почему это?Это ошибка в шутку?

// service file

/**
 * Gets an array of documents.
 */
function list(tableName) {
  const params = {
    TableName: tableName,
  };
  return docClient
    .scan(params)
    .promise()
    .then((result) => {
      return result.Items;
    });
}

// test file

const stubAwsRequestWithFakeArrayReturn = () => {
  return {
    promise: () => {
      return { then: () => ({ Items: 'fake-value' }) };
    },
  };
};

it(`should call docClient.scan() at least once`, () => {
  const mockAwsCall = jest.fn().mockImplementation(stubAwsRequest);
  aws.docClient.scan = mockAwsCall;
  db.list('fake-table');
  expect(mockAwsCall).toBeCalledTimes(1);
});

it(`should call docClient.scan() with the proper params`, () => {
  const mockAwsCall = jest.fn().mockImplementation(stubAwsRequest);
  aws.docClient.scan = mockAwsCall;
  db.list('fake-table');
  expect(mockAwsCall).toBeCalledWith({
    TableName: 'fake-table',
  });
});

it('should return result.Items out of result', async () => {
  const mockAwsCall = jest
    .fn()
    .mockImplementation(stubAwsRequestWithFakeArrayReturn);
  aws.docClient.get = mockAwsCall;
  const returnValue = await db.get('fake-table', 'fake-id');
  expect(returnValue).toEqual({ Items: 'fake-value' });
});

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Библиотеку Chai-as-обещали стоит посмотреть.

https://www.chaijs.com/plugins/chai-as-promised/

Вместо того, чтобы вручную связывать ваши ожидания с выполненными и отклоненными обработчиками обещания.

doSomethingAsync().then(
    function (result) {
        result.should.equal("foo");
        done();
    },
    function (err) {
       done(err);
    }
);

Вы можете написать код, который выражает то, что вы действительно имеете в виду:

return doSomethingAsync().should.eventually.equal("foo");
0 голосов
/ 03 февраля 2019

Строка, не охваченная, - это обратный вызов успеха, переданный then.

. Ваш макет заменяет then функцией, которая не принимает никаких параметров и просто возвращает объект.Обратный вызов из вашего кода передается на макет then во время теста, но он не вызывает обратный вызов, поэтому Jest правильно сообщает, что обратный вызов не охватывается вашими тестами.

Вместо попыткиверните фиктивный объект, который выглядит как Promise, просто верните фактическое разрешение Promise из вашего макета:

const stubAwsRequestWithFakeArrayReturn = () => ({
  promise: () => Promise.resolve({ Items: 'fake-value' })
});

... таким образом then все равно будетфактический Promise.prototype.then и ваш обратный вызов будет вызван, как и ожидалось.


Вы должны также await возвращенный Promise, чтобы убедиться, что обратный вызов был вызван дотест завершен:

it(`should call docClient.scan() at least once`, async () => {
  const mockAwsCall = jest.fn().mockImplementation(stubAwsRequest);
  aws.docClient.scan = mockAwsCall;
  await db.list('fake-table');  // await the Promise
  expect(mockAwsCall).toBeCalledTimes(1);
});

it(`should call docClient.scan() with the proper params`, async () => {
  const mockAwsCall = jest.fn().mockImplementation(stubAwsRequest);
  aws.docClient.scan = mockAwsCall;
  await db.list('fake-table');  // await the Promise
  expect(mockAwsCall).toBeCalledWith({
    TableName: 'fake-table',
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...