2016-03-25 60 views
0

我一直在为使用rsvp承诺的代码编写单元测试。 我试图用pit测试,但必须在使测试通过的RSVP没有运气,但是嵌入式承诺只是正常工作:无法测试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提供的所有内容(例如'all'和其他帮助函数)。

回答

0

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

这不是一个优雅的解决方案,因为我没有看到任何理由说明为什么rsvp promise不应该与“嵌入式”承诺相互作用,但至少它是有效的。

+0

也许你应该提交一个错误? – Laurent