无法在开玩笑中测试rsvp承诺

时间:2016-03-25 04:30:12

标签: javascript babeljs jestjs rsvp.js rsvp-promise

我坚持为使用rsvp promises的代码编写单元测试。 我尝试使用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提供的所有内容(例如&#39;所有&#39;以及其他帮助函数)。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案 - 或者更好的说,是一种解决方法。简而言之:没有必要使用pit方法,它们可以用'it'替换,但在完成所有计时器之前应该运行,可以通过调用jest.runAllTimers()来完成。

这不是一个优雅的解决方案,因为我没有看到任何理由为什么rsvp promises不应该在jest中工作而不是'embedded',但至少它是有效的。