Невозможно проверить обещания rsvp в шутку

Я застрял в написании модульных тестов для моего кода, который использует обещания rsvp. Я пытался использовать pit тесты, но не повезло, что тесты прошли успешно для rsvp, однако встроенные обещания работают просто отлично:

//jest.autoMockOff(); - even with this rsvp test is failing
jest.unmock('rsvp');

import rsvp from 'rsvp';

describe('my rsvp tests', () => {

  // this test fails
  pit('testing rsvp promise', () => {
    return new rsvp.Promise((resolve) => {
      resolve("getting something");
    }).then(()=> { expect(1).toBe(1); });
  });

  // this test passes
  pit('testing pure promise', () => {
    return new Promise((resolve) => {
      resolve("getting something");
    }).then(()=> { expect(1).toBe(1); });
  });
});

Соответствующие детали из моего package.json:

"rsvp": "^3.2.1",
"babelify": "^7.2.0",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"babel-preset-stage-0": "^6.5.0",
"babel-jest": "^9.0.0",
"jest-cli": "*"
 ...
"scripts": {
  "test": "jest"
},

"jest": {
  "unmockedModulePathPatterns": [
    "<rootDir>/node_modules/react",
    "<rootDir>/node_modules/react-dom",
    "<rootDir>/node_modules/react-addons-test-utils"
  ]
}

.babelrc:

{
  "presets": ["es2015", "react", "stage-0"]
}

Я вижу два возможных обходных пути, но ни один из них не похож на:

  1. Макет rsvp обещания с использованием встроенного обещания. Недостаток: модульные тесты станут более многословными, мне нужно будет смоделировать другие функции, такие как rsvp.all, которые я не хочу делать.
  2. Переходите от rsvp к встроенным обещаниям. Это возможно, однако я уже использую одну библиотеку, которая зависит от rsvp, который делает запросы ajax. Я также не уверен, что встроенные обещания могут заменить все, что предоставляет rsvp (например, "все" и другие вспомогательные функции).

1 ответ

Я нашел решение - или, лучше сказать, обходной путь. Короче говоря: нет необходимости использовать методы pit, их можно заменить на 'it', но перед завершением должны быть запущены все таймеры, это можно сделать, вызвав jest.runAllTimers().

Это не элегантное решение, так как я не вижу причин, по которым обещания rsvp не должны работать в шутку, в отличие от "встроенных", но по крайней мере это работает.

Другие вопросы по тегам