Raw rejection error. Although the tests pass

I am testing this feature:

UserController.prototype.getDashboard = function getDashboard(req, res, next) {
  let pages, user;

  return this.User.findById(req.user.id)
    .populate('club')
    .execAsync()
    .then(dbUser => {
      user = dbUser;
      FB.setAccessToken(user.token);

      return FB.getAsync('me/accounts')
    })
    .then(fbPages => {
      pages = fbPages.data;

      return Promise.all(pages.map(page => {
        return FB.getAsync(`${page.id}/events`)
          .then(events => events)
          .catch(e => next(Boom.wrap(e)));
      }))
    })
    .then(events => {
      let entity = {
        user,
        pages: _.map(pages, (page, i) => _.assign({}, page, { events: events[i].data }))
      };

      return res.send(entity);
    })
    .catch(err => next(Boom.wrap(err)));
};

But when I test it, although it passes, I get Unhandled rejection Error

This is my test:

 it('handles errors', (done) => {
  let mockError = new Error('test-error');
  let mockRequest = { user: { id: mockUser._id }};
  let mockNext = td.function();
  let capture = td.matchers.captor();

  td.replace(FB, 'getAsync');
  td.when(FB.getAsync('me/accounts'))
    .thenReturn(Promise.resolve(usersTestData.getDashboard.pages));

  td.when(FB.getAsync(`1769754093273789/events`))
    .thenReturn(Promise.resolve(usersTestData.getDashboard.events[0]))

  // Promise rejection was handled asynchronously
  td.when(FB.getAsync(`731033223716085/events`))
    .thenReturn(Promise.reject(mockError))

  td.when(mockNext(Boom.wrap(mockError)))
    .thenDo(() => { done() });

  controller.getDashboard(mockRequest, _.noop, mockNext);
});

The strange part is that it passes. Therefore, mockNext is called with the expected, but I get the log in the console with an unhandled failure. I tried to process .catchfor each display value, but it still shows the same error (warning?).

I use Bluebird promises, mongoose (promisified) and testdouble. By the way, this is a log from the console after running the test:

dashBoard
Unhandled rejection Error: test-error
โœ“ handles errors
+4
source share
2 answers

, . testdouble API .thenReturn().

, .thenReturn(Promise.reject(...)) td Bluebird promises API promises .thenReject(...). :

td.config({ promiseConstructor: require('bluebird') });

it('handles errors', (done) => {
  let mockError = new Error('test-error');
  let mockRequest = { user: { id: mockUser._id }};
  let mockNext = td.function();
  let capture = td.matchers.captor();

  td.replace(FB, 'getAsync');
  td.when(FB.getAsync('me/accounts'))
    .thenReturn(Promise.resolve(usersTestData.getDashboard.pages));

  td.when(FB.getAsync(`1769754093273789/events`))
    .thenResolve(usersTestData.getDashboard.events[0])

  td.when(FB.getAsync(`731033223716085/events`))
    .thenReject(mockError)

  td.when(mockNext(Boom.wrap(mockError)))
    .thenDo(() => { done() });

  controller.getDashboard(mockRequest, _.noop, mockNext);
});

.

+2

,

td.when(FB.getAsync(`731033223716085/events`))
.thenReturn(Promise.reject(mockError))

, getAsync , ( ). , , :

function ignore(e) {}
function ignoredRejection(e) {
    var p = Promise.reject(e);
    p.catch(ignore);
    return p;
}

td.when(FB.getAsync(`731033223716085/events`))
.thenReturn(ignoredRejection(mockError))
+1

Source: https://habr.com/ru/post/1664231/


All Articles