无法测试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); });
  });
});

我的包.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. 使用嵌入式promise模拟rsvp promise。缺点:单元测试会变得更加冗长,我需要模拟其他我不想做的函数,比如rsvp.all
  2. 从rsvp迁移到嵌入式promise。这是可能的,但是我已经使用了一个库,它依赖于发出ajax请求的rsvp。我也不确定嵌入式promise是否可以取代rsvp提供的所有功能(例如"all"和其他辅助函数)

我找到了一个解决方案,或者说,一个变通方法。简而言之:不需要使用pit方法,它们可以用"it"代替,但在完成之前,所有计时器都应该运行,可以通过调用jest.runAllTimers().来完成

这不是一个优雅的解决方案,因为我看不出为什么rsvp承诺不应该像"嵌入式"承诺那样开玩笑,但至少它是有效的。

最新更新