使用柴和冼方法在一个方法内扼杀诺言

我testing的function大致是这样的;

function doThing(data, callback) { externalService.post('send').request(data) .then(() => { if (callback) { callback(); } }) .catch((message) => { logger.warn('warning message'); if (callback) { callback(); } }); } 

我试图用柴和诗乃来testing。

我尝试过不同的指南,我目前的咒语看起来像;

 const thingBeingTested = require('thing-being-tested'); const chai = require('chai'); const sinon = require('sinon'); require('sinon-as-promised'); const sinonChai = require('sinon-chai'); const expect = chai.expect; var chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); chai.use(sinonChai); describe('The Thing', () => { it('should run a callback when requested and successful', done => { const externalService = { post: { request: sinon.stub() } }; const callback = sinon.spy(); externalService.post.request.resolves(callback); doThing({...}, callback); expect(callback).to.have.been.called; done(); }); }); 

我无法正确取出externalService.post 。 任何帮助将不胜感激。

对于柴和诗乃来说,我是一个全新的人 – 所以我完全期望做一些愚蠢的事情。

您的doThing函数无法从您的testing中访问const externalService 。 我会假设你的主文件有这样的

 const externalService = require('./external_service'); 

为拿到它,为实现它。

在你的testing中,你也应该得到相同的externalService

 describe(..., () => { it(..., () => { // adjust the path accordingly const externalService = require('./external_service'); 

然后嘲笑它的方法:

 sinon.stub(externalService, 'post').returns({ request: sinon.stub().resolves(callback) }); 

然后,您可以调用doThing并分析结果。

testing完成后,不要忘记恢复原来的post

 externalService.post.restore();